首页 > 解决方案 > 是否可以同时执行两个功能

问题描述

我想同时(或尽可能靠近)从 2 个不同的相机拍摄照片。

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

Take_photo_1.start()
Take_photo_2.start()

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

标签: pythonmultithreadingparallel-processingmultiprocessing

解决方案


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

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

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

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

对于这种情况,通常最简单的做法就是以显而易见的方式编写代码,对其进行压力测试,看看它是否满足您的要求,然后找出不符合要求的优化方法。

因此,您现有的代码可能没问题。

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

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

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

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


推荐阅读