是否可以完全同时执行两个功能

时间:2018-07-16 21:32:58

标签: python multithreading parallel-processing multiprocessing

我想同时(或尽可能近)从两台不同的相机拍照。

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

Take_photo_1.start()
Take_photo_2.start()

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

1 个答案:

答案 0 :(得分:1)

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

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

幸运的是,很少有现实生活中的问题具有如此严格的实时性要求。取而代之的是,您有一个要求,例如“ 99.9%的时间,所有摄像机获取都应在所需的精确30fps的+/- 4ms内发生”。或者,也许,“只要您不做任何事情,90%的时间在+/- 1ms之内,99.9%的时间在+/- 4ms之内,99.999%的时间在+/- 20ms之内愚蠢,就像在运行代码时更改笔记本电脑的墙式电源状态。”

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

在这种情况下,通常最简单的方法是以明显的方式编写代码,对其中的内容进行压力测试,查看其是否满足您的要求,并找出仅在不满足要求时才进行优化的方法

因此,您现有的代码可能很好。

如果没有,则只需要在barrier = threading.Barrier()之前添加共享的barrier.wait()并执行camera.get()

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

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

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