使用multiprocessing多进程调用cv2读取视频出现阻塞该如何解决?
问题原因
cv2.VideoCapture的底层依赖操作系统文件句柄、解码器上下文等非Python原生资源,你在父进程的__init__方法中初始化该实例后,跨进程传递到子进程时,这些底层资源无法被正确继承,导致子进程调用read()时底层IO状态异常,直接出现阻塞。
单进程运行无问题是因为所有资源都在同一个进程上下文内初始化、调用,不存在跨进程资源传递的异常。
修复方案
把cv2.VideoCapture的初始化逻辑移到子进程的run()方法中,确保所有视频读取相关资源都在子进程自身的上下文中创建。如果需要动态传入视频路径,可在__init__中先存储路径参数,再在run()中调用:
import cv2 from multiprocessing import Process class ComputePSNRProcess(Process): def __init__(self, video_path): super(ComputePSNRProcess, self).__init__() # 仅存储路径,不初始化VideoCapture self.video_path = video_path self.reader_1920_1080 = None def run(self): # 子进程内部初始化VideoCapture self.reader_1920_1080 = cv2.VideoCapture(self.video_path) while True: success, original_1920_1080 = self.reader_1920_1080.read() # 增加读取失败判断,避免卡死或报错 if not success: break cv2.imshow('original', original_1920_1080) cv2.waitKey(25) # 退出时释放资源 self.reader_1920_1080.release() cv2.destroyAllWindows() computePSNR = ComputePSNRProcess('res_1920_1080.ivf') computePSNR.start() # 可选配置:等待子进程执行结束 computePSNR.join()
额外注意项
- 不要在父进程和子进程中操作同一个
cv2.VideoCapture实例,避免出现资源竞争 - 涉及GUI相关的
cv2.imshow、cv2.waitKey方法尽量都放在同一个进程中调用,跨进程调用GUI接口也可能出现异常
内容的提问来源于stack exchange,提问作者Ahmad Alhilal
相关产品推荐
相关产品推荐

