如何在子进程中终止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
相关产品推荐
相关产品推荐

