我想同时(或尽可能近距离(从两台不同的相机拍摄照片。
如果我使用多线程或多处理,它仍然连续运行线程/进程。。例如,如果我启动以下过程:
Take_photo_1.start()
Take_photo_2.start()
虽然这些进程将并行运行,但启动进程的命令仍然按顺序执行。有没有办法同时执行这两个过程?
即使直接用机器代码编写,也无法使精确。即使所有线程都在内核屏障上等待,在不同的内核上等待可能需要不同的时间,并且在屏障等待和相机获取之间需要处理操作码,这些操作码必须在缓存可能处于不同状态的系统上获取并运行,没有什么可以阻止操作系统从其中一个线程窃取CPU来运行一些完全无关的代码,并且到相机的I/O(即使它没有串行化,也可能是串行化的(可能不是一个有保证的静态时间,等等
当你把一种解释语言放在它上面时(尤其是带有GIL的语言,比如Python,这意味着屏障等待和相机获取之间的字节码不能并行运行(……嗯,你并没有真正改变任何东西;"不可能*7"仍然是"不可能"。但你让它变得更加明显。
幸运的是,很少有现实生活中的问题有真正的实时性要求。相反,你有一个要求,比如"99.9%的时间,所有的相机拍摄都应该在所需的精确30fps的+/-4ms内进行"。或者,也许,"90%的时间在+/-1ms内,99.9%的时间在+/-4ms内,99.999%的时间在+/-20ms内,只要你在运行代码时不做任何愚蠢的事情,比如改变笔记本电脑的电源状态"。
或者……好吧,只有你知道你为什么想要"精确",并且能够弄清楚满足你的实际需求是什么。
在这种情况下,通常最简单的事情就是以显而易见的方式编写代码,对其进行压力测试,看看它是否符合您的要求,并找出如何在不符合要求的情况下进行优化。
因此,您现有的代码可能很好。
如果没有,添加一个共享的barrier = threading.Barrier()
并在camera.get()
之前执行barrier.wait()
可能就是您所需要的。
您可能需要添加逻辑来检测定时器滞后并重新同步(您可以在每个线程中独立执行此操作,或者让先到达那里的线程计算它,然后让其他人在屏障处等待(。
你可能需要在C中重写核心循环。或者转储你正在使用的任何一个操作系统,以获得像QNX这样具有更好实时性保证的操作系统。或者完全抛弃操作系统,这样就没有调度器可以阻挡了。或者抛弃复杂的超标量CPU,将整个过程实现为硬件状态机。或者…
但是,假设你一开始就有合理的要求,你通常不必走得太远。