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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:48:06