使用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,避免主进程启动时就加载第二个服务的代码,减少不必要的资源占用。
测试验证
- 运行
main.py启动主服务。 - 访问
http://localhost:5000/check触发第二个服务启动。 - 访问
http://localhost:3333验证第二个服务是否正常响应。
内容的提问来源于stack exchange,提问作者Double_E
相关产品推荐
相关产品推荐

