You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 15:45:11