Python使用multiprocess运行WebSocket监听和视频流出现阻塞如何解决
问题核心原因
你创建多进程的写法存在错误,导致无限循环直接在主进程的asyncio协程里同步执行了,根本没有启动子进程:
p = Process(target = init(self))这行代码的target参数需要传入可调用对象的引用,但你写的init(self)是直接当场执行init函数,init里调用的startStreaming是无限循环,直接阻塞了主进程后续的WebSocket监听逻辑,进程启动代码p.start()根本不会被执行。
修复方案
1. 修正多进程创建语法
把Process的target参数改成函数引用,参数通过args传入:
# 错误写法:当场执行init,直接卡死 # p = Process(target = init(self)) # 正确写法:传入函数引用,参数单独传递 p = Process(target=init, args=(self,)) p.start()
2. 适配多进程资源隔离规则
多进程之间内存不共享,你当前代码把WebSocket对象传给子进程的逻辑是无效的,WebSocket是主进程创建的网络连接,不能跨进程传递。如果需要在视频流逻辑里和WebSocket交互,可选两种适配方案:
- 方案一:把
startStreaming改造成异步函数,用asyncio.create_task创建异步任务,和WebSocket监听放在同一个事件循环运行,无需多进程:
示例代码:# 改造startStreaming为异步函数后 async def __aenter__(self): async with websockets.connect(url,max_size= None) as websocket: self.websocket = websocket await self.on_open() # 创建异步任务,不会阻塞后续WebSocket监听 asyncio.create_task(startStreaming(self)) async for message in websocket: await on_message(message, websocket) - 方案二:如果
startStreaming只能是同步无限循环,保留多进程方案,用multiprocessing.Queue做跨进程通信,子进程把要发送的消息放到队列中,主进程单独启动异步任务监听队列,拿到消息后通过主进程的WebSocket对象发送。
3. 可选:配置子进程守护属性
如果需要主进程退出时自动关闭视频流子进程,可以给进程设置daemon=True:
p = Process(target=init, args=(self,), daemon=True) p.start()
内容的提问来源于stack exchange,提问作者MarioC
相关产品推荐
相关产品推荐

