perf: optimize system concurrency, I/O stability and fix WebSocket disconnects
This commit is contained in:
@@ -148,8 +148,9 @@ class Gateway:
|
||||
self.handle_client,
|
||||
host,
|
||||
port,
|
||||
ping_interval=30,
|
||||
ping_timeout=60,
|
||||
ping_interval=20,
|
||||
ping_timeout=120,
|
||||
max_size=10 * 1024 * 1024, # 10MB
|
||||
)
|
||||
logger.info(f"WebSocket server ready: ws://{host}:{port}")
|
||||
|
||||
@@ -833,12 +834,18 @@ class Gateway:
|
||||
if not self.connected_clients:
|
||||
return
|
||||
|
||||
message_json = json.dumps(message, ensure_ascii=False, default=str)
|
||||
# Offload potentially heavy JSON serialization to thread
|
||||
message_json = await asyncio.to_thread(
|
||||
json.dumps, message, ensure_ascii=False, default=str
|
||||
)
|
||||
|
||||
async with self.lock:
|
||||
# Filter only active clients to minimize unnecessary send attempts
|
||||
# In websockets v13+, we must check state.name == 'OPEN'
|
||||
active_clients = [c for c in self.connected_clients if c.state.name == 'OPEN']
|
||||
tasks = [
|
||||
self._send_to_client(client, message_json)
|
||||
for client in self.connected_clients.copy()
|
||||
for client in active_clients
|
||||
]
|
||||
|
||||
if tasks:
|
||||
@@ -849,9 +856,14 @@ class Gateway:
|
||||
client: ServerConnection,
|
||||
message: str,
|
||||
):
|
||||
if client.state.name != 'OPEN':
|
||||
async with self.lock:
|
||||
self.connected_clients.discard(client)
|
||||
return
|
||||
|
||||
try:
|
||||
await client.send(message)
|
||||
except websockets.ConnectionClosed:
|
||||
except (websockets.ConnectionClosed, Exception):
|
||||
async with self.lock:
|
||||
self.connected_clients.discard(client)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user