Skip to content

Commit b904931

Browse files
wehosclaude
andauthored
fix(session): 消除 end_session 路径上 ~1 秒的 event loop 阻塞 (Project-N-E-K-O#843)
* fix(session): 消除 end_session 路径上 ~1 秒的 event loop 阻塞 Qwen Realtime 的 `ClientConnection.close()` 默认 close_timeout=10s, 若远端迟迟不回 CLOSE 帧,`await self.ws.close()` 会把 end_session 协程挂起数百毫秒到数秒(日志中观察到 ~1s)。 改用 asyncio.wait_for(..., timeout=0.5),超时后 transport.abort() 做本地强制关闭,保证 end_session 快速返回、主事件循环心跳不受影响。 * refactor(session): 改用 close_timeout 参数替代 transport.abort() 私有 API CodeRabbit 指出 ClientConnection.transport 不是公开稳定接口。改用 websockets.connect(..., close_timeout=0.5):close handshake 超时后 库内部会自行 abort transport,效果等价但只依赖公开 API。 --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1e621d2 commit b904931

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

main_logic/omni_realtime_client.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,10 @@ async def connect(self, instructions: str, native_audio=True) -> None:
482482
headers = {
483483
"Authorization": f"Bearer {self.api_key}"
484484
}
485-
self.ws = await websockets.connect(url, additional_headers=headers)
485+
# close_timeout=0.5 缩短 close handshake 的等待上限:默认 10s 会把
486+
# end_session 协程挂住数百毫秒~数秒(Qwen 回 CLOSE 帧偶尔很慢),
487+
# 超时后 websockets 内部会 transport.abort() 强制关闭。
488+
self.ws = await websockets.connect(url, additional_headers=headers, close_timeout=0.5)
486489
# Clear fatal flag so send_event/update_session work on this new
487490
# connection (flag may be leftover from a previous failed session
488491
# when the same OmniRealtimeClient instance is reused).
@@ -1691,7 +1694,9 @@ async def close(self) -> None:
16911694

16921695
if self.ws:
16931696
try:
1694-
# 尝试关闭websocket连接
1697+
# 连接时已设 close_timeout=0.5s:远端超时未回 CLOSE 帧时,
1698+
# websockets 内部会自行 abort transport 强制关闭,
1699+
# 保证 end_session 快速返回、主事件循环心跳不受影响。
16951700
await self.ws.close()
16961701
except Exception as e:
16971702
logger.error(f"Error closing websocket: {e}")

0 commit comments

Comments
 (0)