Python多摄像头场景下多线程与多进程选型及相关问题咨询
多摄像头图像采集与处理的线程/进程问题解答
Q1:若遍历队列数组处理图像,ImgProc类的函数运行在进程还是线程中?
运行在主线程中。你的示例代码里,stream_manager.process_images()是在主程序的while True循环里执行的,这个循环所在的线程就是启动程序时的主线程。start_streams()创建的是独立线程负责捕获图像,但图像处理逻辑并没有开启新线程或新进程,完全在主线程的上下文里执行。
Q2:是否应使用multiprocessing实现每个摄像头流,并通过multiprocessing.Array搭配collections.deque与独立的图像处理进程共享数据?
没必要这么复杂,更高效的方案是混合模式:
- 摄像头采集用多线程:摄像头帧读取属于I/O密集型任务,多线程的切换开销远低于多进程,完全能满足需求,不需要为每个摄像头单独开进程。
- 图像处理用多进程:图像处理是CPU密集型任务,受Python GIL(全局解释器锁)限制,多线程无法利用多核CPU,改用多进程池(
multiprocessing.Pool)或者独立处理进程,配合进程安全的队列(multiprocessing.Queue)传递图像帧即可。
另外,collections.deque不是进程安全的,不能跨进程直接共享;multiprocessing.Array适合存储简单的数值型数据,用来存图像帧会非常麻烦,不如直接用multiprocessing.Queue来传递图像对象,实现成本更低、更可靠。
Q3:若在Stream类的构造函数中初始化DummyList对象x并向其追加1,因线程共享内存空间,stream0和stream1会共享该DummyList吗?还是会成为各自独立的对象,仅其中一个的x为[1],另一个为[]?
stream0和stream1的x是各自独立的对象,每个实例的x都是[1]。
原因很简单:你是在Stream类的构造函数(__init__)里初始化的x,也就是给每个实例的self.x赋值了新的DummyList对象,这属于实例属性,不是类属性。线程共享的是进程的内存空间,但不同实例的实例属性是各自独立的内存块,互相不会干扰。只有当x是定义在Stream类层面的类属性时,才会被所有实例共享。
内容的提问来源于stack exchange,提问作者MrOCW
相关产品推荐
相关产品推荐

