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

Flask-SocketIO与multiprocessing结合疑似存在异常问题

问题分析与解决方案

这确实是Flask-SocketIO(搭配eventlet/gevent异步模式)与multiprocessing结合时的典型限制,核心问题出在异步框架的猴子补丁(monkey_patch)篡改了标准库的进程创建逻辑,导致多次创建进程后出现资源泄漏或逻辑冲突。

具体原因

  1. 猴子补丁的副作用:eventlet/gevent的monkey_patch()会替换Python标准库中线程、进程相关的实现,包括multiprocessing.Process。被修改后的进程创建逻辑会和异步框架的协程调度绑定,多次创建子进程后,容易出现协程上下文残留、资源未正确回收等问题,最终导致无法创建新进程。
  2. 初期正常的原因:刚开始进程创建次数少,异步框架的资源占用和逻辑冲突还没达到阈值,随着创建次数增加,矛盾逐渐显现,但SocketIO的事件接收是基于协程/线程的,不受进程创建失败影响,所以服务器仍能正常接收事件。

可行解决方案

方案1:隔离进程创建与异步上下文

把进程创建逻辑放到不受猴子补丁影响的环境中,比如用subprocess代替multiprocessing(subprocess直接调用系统进程,不受猴子补丁干扰):

  • 先写独立的工作脚本worker.py:
from time import time

def process_stuff():
    print("Process Initialized")
    start_time = time()
    while time() - start_time < 60:
        # 处理业务逻辑
        continue
    print("Process Terminated")

if __name__ == "__main__":
    process_stuff()
  • 修改主脚本,用subprocess调用:
import eventlet
eventlet.monkey_patch()

from flask_socketio import SocketIO
from flask import Flask
import subprocess

app = Flask(__name__)
sio = SocketIO(app, logger=True, engineio_logger=True, async_mode='eventlet')

@sio.on('create_process')
def create_process():
    # 启动独立系统进程
    subprocess.Popen(["python", "worker.py"])

sio.run(app, "0.0.0.0", 8000)

方案2:改用threading异步模式

如果业务并发量不高,可以放弃eventlet/gevent,使用Flask-SocketIO的threading异步模式,这种模式下不会对multiprocessing的逻辑进行修改:

from multiprocessing import Process
from flask_socketio import SocketIO
from flask import Flask
from time import time

app = Flask(__name__)
# 使用threading异步模式,无需猴子补丁
sio = SocketIO(app, logger=True, engineio_logger=True, async_mode='threading')

@sio.on('create_process')
def create_process():
    test_process = Process(target=process_stuff)
    test_process.start()

def process_stuff():
    print("Process Initialized")
    start_time = time()
    while time() - start_time < 60:
        # 处理业务逻辑
        continue
    print("Process Terminated")

sio.run(app, "0.0.0.0", 8000)

方案3:独立进程管理器

用消息队列(如Redis)把创建进程的请求转发给一个未被猴子补丁修改的独立进程管理器,由管理器负责创建子进程,完全隔离SocketIO服务和进程创建逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:18