Skip to content

Commit bc8bf4c

Browse files
committed
fix(windows): 静默处理底层 socket 异常并改用 wsproto WebSocket
1 parent 5dda176 commit bc8bf4c

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

‎main.py‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import os
22
import sys
3+
import asyncio
34
import subprocess
45
os.environ["PYTHONFAULTHANDLER"] = "0"
56
if sys.platform == "win32":
67
try:
78
import win32api
89
win32api.SetConsoleCtrlHandler(None, 0)
910
except:pass
11+
12+
# Windows 下静默处理底层 socket 异常(如网络切换导致的 WinError 64),
13+
# 避免 asyncio 回调把已断开连接的错误刷成 traceback
14+
def _loop_exception_handler(loop, context):
15+
exc = context.get("exception")
16+
msg = str(context.get("message", ""))
17+
if isinstance(exc, OSError) or "recvfrom" in msg or "WinError 64" in msg:
18+
return
19+
loop.default_exception_handler(context)
20+
try:
21+
asyncio.get_event_loop().set_exception_handler(_loop_exception_handler)
22+
except Exception:
23+
pass
1024
from fastapi import FastAPI, Request, HTTPException
1125
from fastapi.middleware.cors import CORSMiddleware
1226
from fastapi.responses import HTMLResponse, JSONResponse, FileResponse
@@ -172,5 +186,14 @@ def start_monitor():
172186
start_monitor()
173187
try:
174188
import uvicorn
175-
uvicorn.run(app, host=HOST, port=PORT)
189+
# Windows 下用 wsproto 处理 WebSocket:基于纯 asyncio 流,规避 ProactorEventLoop
190+
# 在 UDP/传输 socket 上的 WinError 64 异常(默认 websockets 库会冒泡到 asyncio 回调)
191+
run_kwargs = {}
192+
if sys.platform == "win32":
193+
try:
194+
import wsproto # noqa: F401
195+
run_kwargs["ws"] = "wsproto"
196+
except Exception:
197+
pass
198+
uvicorn.run(app, host=HOST, port=PORT, **run_kwargs)
176199
finally:shutdown_nvml()

‎requirements-windows.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
fastapi==0.109.0
22
uvicorn[standard]==0.27.0
33
websockets==12.0
4+
wsproto==1.2.0
45
psutil==5.9.8
56
py3nvml==0.2.7
67
python-multipart==0.0.6

0 commit comments

Comments
 (0)