我一直在与我的应用程序中的“并行处理需求”作斗争。我比较清楚,GIL 会阻止单个解释器中的并发处理,并且每个进程只能有一个解释器。至少到3.10(我需要使用3.8来集成制造商的驱动程序)。但我的申请证明具有挑战性。 我的申请要求:
,它将处理连接到计算机的任意数量的 Flir 相机,用于机器人和机器视觉。这意味着图像采集模块将与控制重要事物的其他模块并行运行,例如电机和 DAQ。 初始化时,图像采集模块会检查系统中的所有摄像机,看看哪一个具有所请求的名称:
import ImageAcquisition as ia
ia.Initialize("cam1", "cam2") # Creates two parallel process. One for each camera.
对于每个相机,应创建一个并行进程来处理与其相关的图像分析。这意味着抓取帧、显示它们、处理它们,并使一些图像分析结果可供主进程使用。
一个重要的要求是模块是独立的。但是,我发现程序入口代码(客户端代码)中始终需要
if __name__ == "__main__":
测试。这是因为新进程也将在其解释器上运行主程序。
除了if __name__ == "__main__":
之外还有其他选择吗?
这样我就可以让我的模块完全独立。一种替代方法是使用子进程库并在没有 Windows 中多处理库使用的“生成”机制的情况下运行进程。但是,在进程之间共享信息时会产生一些开销,而多处理库可以更好地处理这些开销。
另一种选择是在我们的主应用程序中将
if __name__ == "__main__":
注入用户的字符串中。