Python3.10中Flask热重载失效:非套接字操作错误排查
Flask热重载失效并抛出WinError 10038的排查方案
问题背景
使用Python 3.10.11、Flask 3.0.0和Werkzeug 3.0.1开发的项目,此前运行正常,时隔数月后热重载功能突然失效,抛出错误:[WinError 10038] 尝试对非套接字执行操作。此外,有时重启应用(关闭并重新打开终端)后代码仍未更新。
已尝试的无效操作:
- 更换多个Python、Flask及Werkzeug版本
- 执行
netsh winsock reset命令 - 删除并重建pipenv环境,在全局和虚拟环境中运行应用
- 使用多种启动方式:
flask --debug run、py ./app.py、pipenv run py ./app.py - 更换端口
报错堆栈信息:
Exception in thread Thread-2 (serve_forever): Traceback (most recent call last): File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner self.run() File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\werkzeug\serving.py", line 806, in serve_forever super().serve_forever(poll_interval=poll_interval) File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\socketserver.py", line 232, in serve_forever ready = selector.select(poll_interval) File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\selectors.py", line 324, in select r, w, _ = self._select(self._readers, self._writers, [], timeout) File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\selectors.py", line 315, in _select r, w, x = select.select(r, w, w, timeout) OSError: [WinError 10038] An operation was attempted on something that is not a socket
排查方向
强制清理残留进程
- 打开任务管理器,结束所有与Python相关的进程(包括
python.exe、flask.exe),再重新启动应用 - 用命令行定位端口占用进程:
netstat -ano | findstr :<你的端口号>,找到PID后执行taskkill /F /PID <PID>强制终止
- 打开任务管理器,结束所有与Python相关的进程(包括
排查安全软件干扰
- 暂时关闭系统防火墙、第三方杀毒软件(尤其是监控本地网络连接的工具),测试热重载是否恢复正常,排查是否是安全软件拦截了套接字的释放与重建
统一调试模式配置
- 避免混用多种调试启动方式,比如不要同时使用
flask --debug run和代码中的app.run(debug=True),只保留一种启动逻辑 - 尝试关闭重载启动应用:
flask run --no-reload,如果能正常运行,说明问题出在重载机制的进程管理环节
- 避免混用多种调试启动方式,比如不要同时使用
检查代码中的资源泄漏
- 排查代码中是否有自定义的信号处理函数(如
SIGINT/SIGTERM),这类函数可能导致进程退出时未正确释放套接字资源 - 检查是否存在未关闭的文件句柄、数据库连接、线程等资源,这些可能导致重载时父进程无法正常终止子进程
- 排查代码中是否有自定义的信号处理函数(如
测试极简应用定位问题
- 创建一个最小化的Flask应用,在相同环境下测试热重载:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True) - 如果极简应用热重载正常,说明问题出在原项目的代码或依赖冲突上,可逐步添加原项目的代码/依赖来定位具体诱因
- 创建一个最小化的Flask应用,在相同环境下测试热重载:
内容的提问来源于stack exchange,提问作者Ilan Yashuk
相关产品推荐
相关产品推荐

