python - 是否可以同时执行两个函数

标签 python multithreading parallel-processing multiprocessing

我想在同一时间(或尽可能接近)用 2 个不同的相机拍摄照片。

如果我使用多线程或多处理,它仍然连续运行线程/进程。例如,如果我启动以下进程:

Take_photo_1.start()
Take_photo_2.start()

虽然这些进程将并行运行,但启动进程的命令仍然按顺序执行。有什么办法可以同时执行这两个进程吗?

最佳答案

即使您直接用机器代码编写,也无法使其精确。即使所有线程都在内核屏障上等待,该等待在不同内核上可能会花费不同的时间,并且在屏障等待和相机获取之间需要处理一些操作码,这些操作码必须在缓存的系统上获取并运行可能处于不同的状态,并且没有什么可以阻止操作系统从其中一个线程窃取 CPU 来运行一些完全不相关的代码,以及相机的 I/O(即使它没有被序列化,这可能是)可能不是保证的静态时间,等等。

当你在它上面添加一种解释性语言时(尤其是带有 GIL 的语言,例如 Python,这意味着屏障等待和相机获取之间的字节码无法并行运行)……好吧,你不是真正改变一切; “不可能*7”仍然是“不可能”。但你让它变得更加明显。

幸运的是,现实生活中很少有问题有这样的真正的硬实时要求。相反,您有这样的要求:“99.9% 的时间,所有相机获取都应在所需的精确 30fps 的 +/-4 毫秒内发生”。或者,也许,“只要您不执行任何操作,90% 的时间在 +/-1ms 内,99.9% 的时间在 +/-4ms 内,99.999% 的时间在 +/-20ms 内就像在运行代码时更改笔记本电脑的墙壁电源状态一样愚蠢”。

或者......好吧,只有你知道为什么你想要“精确”,并且可以弄清楚什么是可以满足你的实际要求。

对于这种情况,最简单的做法通常是以显而易见的方式编写代码,对其进行压力测试,看看它是否满足您的要求,并在不满足要求时找出如何优化的方法.

所以,您现有的代码可能没问题。

如果没有,添加共享barrier = threading.Barrier()并做 barrier.wait()就在 camera.get() 之前可能就是您所需要的。

您可能需要添加逻辑来检测计时器滞后并重新同步(您可以在每个线程中独立执行此操作,或者让第一个到达那里的线程计算它并让其他人在屏障处等待)。

您可能需要用 C 语言重写核心循环。或者将您正在使用的操作系统转储为具有更好实时保证的操作系统,例如 QNX。或者完全抛弃操作系统,这样就没有调度程序来妨碍。或者扔掉复杂的超标量 CPU,将整个系统实现为硬件状态机。或者……

但是,假设您首先有合理的要求,通常不必走得太远。

关于python - 是否可以同时执行两个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370377/

相关文章:

java - 如何解决这个线程阻塞问题

multithreading - 当多个客户端调用WCF服务时,一个或多个AppDomains在服务器端创建了吗?

python - pathos: parallel processing options - 有人能解释一下差异吗?

c# - 在并行数据处理中使用什么类型的队列 - C# - .NET 4

python - 如何使用 Selenium 与 cookies 模式进行交互?

python - 定义类包含什么

python - 面板回归给出错误 "exog does not have full column rank"

python - 将 `app.add_route()` 用于 GraphQL 时,如何在 FastAPI 中获取用户身份验证信息?

C#进程线程无法写入输出

android - 同时调用多个 API 并在相应请求的处理完成后立即更新 UI Android