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

使用subprocess启动多Flask服务报错[WinError10038]求解决方案

解决Flask主服务中启动第二个服务出现[WinError 10038]的问题

错误原因分析

WinError 10038本质是尝试对非套接字资源执行网络操作,出现该问题的核心原因是:你在主Flask服务的路由处理线程中直接调用了第二个Flask服务的run()方法。Flask的开发服务器(Werkzeug)默认会占用当前进程的网络资源,且run()方法是阻塞式的,在同一进程内嵌套启动两个服务会导致套接字管理混乱,触发系统层面的资源操作错误。

解决方案:用多进程隔离两个Flask服务

将第二个Flask服务放到独立的进程中启动,让两个服务的网络资源、运行环境完全隔离,即可避免该错误。具体实现步骤如下:

1. 修改主服务代码(main.py)

导入multiprocessing模块,在路由中创建子进程来启动第二个服务,同时关闭第二个服务的自动重载(use_reloader=False),避免重载机制导致的进程重复创建问题。

示例代码:

from flask import Flask
import multiprocessing
import sys
import os

# 添加当前目录到模块搜索路径,确保能导入main2
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

app = Flask(__name__)

def start_second_service():
    from main2 import app as app2
    # 关闭自动重载,避免多进程环境下的冲突
    app2.run(host='0.0.0.0', port=3333, use_reloader=False)

@app.route('/check')
def check():
    # 创建子进程启动第二个服务
    p = multiprocessing.Process(target=start_second_service)
    p.daemon = True  # 设置守护进程,主服务退出时子进程自动结束
    p.start()
    return "第二个Flask服务已启动"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

2. 保持第二个服务代码(main2.py)不变

确保第二个服务的代码是标准的Flask应用结构:

from flask import Flask

app2 = Flask(__name__)

@app2.route('/')
def index():
    return "这是第二个Flask服务"

if __name__ == '__main__':
    app2.run(host='0.0.0.0', port=3333)

3. 关键注意事项

  • 关闭自动重载:在子进程中启动第二个服务时必须设置use_reloader=False,否则Werkzeug的重载机制会额外创建新进程,导致资源冲突。
  • 守护进程设置:将子进程设为守护进程,确保主Flask服务停止时,第二个服务也会自动退出,避免残留进程占用端口。
  • 模块导入时机:在start_second_service函数内部导入main2,避免主进程启动时就加载第二个服务的代码,减少不必要的资源占用。

测试验证

  1. 运行main.py启动主服务。
  2. 访问http://localhost:5000/check触发第二个服务启动。
  3. 访问http://localhost:3333验证第二个服务是否正常响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:15:41