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

如何在子进程中终止while循环?cv2录屏多进程实现问题

解决多进程录屏中无法终止子进程循环的问题

你遇到的核心问题是多进程内存空间隔离:主进程和子进程拥有独立的内存,类变量terminator在子进程启动时会被复制一份,主进程修改的是自己内存里的变量,无法影响子进程的副本。另外你的代码还有一个低级错误:start()方法里target=self.func()是直接调用了函数,而非将函数对象传给子进程执行,导致录屏逻辑实际在主进程跑,子进程根本没启动。

下面给出两种可靠的解决方案:

方案一:用multiprocessing.Event实现优雅终止(推荐)

Event是多进程安全的信号量,专门用来做进程间的通知。主进程通过设置事件,子进程检测事件状态来终止循环,同时能保证cv2资源正常释放。

修正后的完整代码:

import time
import cv2
from multiprocessing import Process, Event


class Recorder:
    def __init__(self):
        self.proc = None
        self.stop_event = Event()  # 初始化终止事件

    def _record(self):
        # 初始化录屏捕获器(根据实际需求调整,比如录屏用desktop capture)
        cap = cv2.VideoCapture(0)  # 示例:捕获摄像头,实际录屏需替换为对应源
        # 初始化视频写入器(参数根据实际分辨率、帧率调整)
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
        writer = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
        
        # 循环录屏,直到收到终止信号
        while not self.stop_event.is_set():
            ret, frame = cap.read()
            if not ret:  # 捕获失败则退出
                break
            writer.write(frame)
        
        # 必须释放cv2资源,避免内存泄漏或视频文件损坏
        cap.release()
        writer.release()
        cv2.destroyAllWindows()

    def start(self):
        self.stop_event.clear()  # 重置终止状态
        # target传函数对象,不要带括号!
        self.proc = Process(target=self._record)
        self.proc.start()

    def stop(self):
        self.stop_event.set()  # 发送终止信号
        self.proc.join()  # 等待子进程完全退出


if __name__ == '__main__':
    test = Recorder()
    test.start()
    time.sleep(5)  # 模拟录屏期间执行其他操作
    test.stop()

方案二:用Process.terminate()强制终止(不推荐)

如果不需要优雅释放资源,可以直接强制杀死子进程,但这种方式可能导致视频文件写入不完整,cv2资源无法正常释放,仅作为备选:

def stop(self):
    self.proc.terminate()  # 强制终止子进程
    self.proc.join()

关键注意事项

  • 多进程间不能直接共享普通变量,必须使用multiprocessing提供的共享对象(Event、Value、Queue等)
  • 启动子进程时,target必须传函数对象(不带括号),否则函数会直接在主进程执行,子进程无法启动
  • 后台录屏可以去掉cv2.imshow()和cv2.waitKey(),避免依赖GUI窗口,同时降低资源消耗

内容的提问来源于stack exchange,提问作者timqae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:35:19