我想在同一时间(或尽可能接近)用 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/