@@ -96,6 +96,44 @@ async def _analyze_model_requirements(req_id: str, context: dict, request: ChatC
9696 return context
9797
9898
99+ async def _test_client_connection (req_id : str , http_request : Request ) -> bool :
100+ """通过发送测试数据包来主动检测客户端连接状态"""
101+ try :
102+ # 尝试发送一个小的测试数据包
103+ test_chunk = "data: {\" type\" :\" ping\" }\n \n "
104+
105+ # 获取底层的响应对象
106+ if hasattr (http_request , '_receive' ):
107+ # 检查接收通道是否还活跃
108+ try :
109+ # 尝试非阻塞地检查是否有断开消息
110+ import asyncio
111+ receive_task = asyncio .create_task (http_request ._receive ())
112+ done , pending = await asyncio .wait ([receive_task ], timeout = 0.01 )
113+
114+ if done :
115+ message = receive_task .result ()
116+ if message .get ("type" ) == "http.disconnect" :
117+ return False
118+ else :
119+ # 取消未完成的任务
120+ receive_task .cancel ()
121+ try :
122+ await receive_task
123+ except asyncio .CancelledError :
124+ pass
125+
126+ except Exception :
127+ # 如果检查过程中出现异常,可能表示连接有问题
128+ return False
129+
130+ # 如果上述检查都通过,认为连接正常
131+ return True
132+
133+ except Exception as e :
134+ # 任何异常都认为连接已断开
135+ return False
136+
99137async def _setup_disconnect_monitoring (req_id : str , http_request : Request , result_future : Future ) -> Tuple [Event , asyncio .Task , Callable ]:
100138 """设置客户端断开连接监控"""
101139 from server import logger
@@ -105,13 +143,24 @@ async def _setup_disconnect_monitoring(req_id: str, http_request: Request, resul
105143 async def check_disconnect_periodically ():
106144 while not client_disconnected_event .is_set ():
107145 try :
146+ # 使用主动检测方法
147+ is_connected = await _test_client_connection (req_id , http_request )
148+ if not is_connected :
149+ logger .info (f"[{ req_id } ] 主动检测到客户端断开连接。" )
150+ client_disconnected_event .set ()
151+ if not result_future .done ():
152+ result_future .set_exception (HTTPException (status_code = 499 , detail = f"[{ req_id } ] 客户端关闭了请求" ))
153+ break
154+
155+ # 备用检查:使用原有的is_disconnected方法
108156 if await http_request .is_disconnected ():
109- logger .info (f"[{ req_id } ] 客户端断开,设置事件 。" )
157+ logger .info (f"[{ req_id } ] 备用检测到客户端断开连接 。" )
110158 client_disconnected_event .set ()
111159 if not result_future .done ():
112160 result_future .set_exception (HTTPException (status_code = 499 , detail = f"[{ req_id } ] 客户端关闭了请求" ))
113161 break
114- await asyncio .sleep (0.5 ) # 更频繁的检查间隔,从1.0秒改为0.5秒
162+
163+ await asyncio .sleep (0.3 ) # 更频繁的检查间隔,从0.5秒改为0.3秒
115164 except asyncio .CancelledError :
116165 break
117166 except Exception as e :
@@ -755,7 +804,16 @@ async def _process_request_refactored(
755804 result_future : Future
756805) -> Optional [Tuple [Event , Locator , Callable [[str ], bool ]]]:
757806 """核心请求处理函数 - 重构版本"""
758-
807+
808+ # 优化:在开始任何处理前主动检测客户端连接状态
809+ is_connected = await _test_client_connection (req_id , http_request )
810+ if not is_connected :
811+ from server import logger
812+ logger .info (f"[{ req_id } ] ✅ 核心处理前检测到客户端断开,提前退出节省资源" )
813+ if not result_future .done ():
814+ result_future .set_exception (HTTPException (status_code = 499 , detail = f"[{ req_id } ] 客户端在处理开始前已断开连接" ))
815+ return None
816+
759817 context = await _initialize_request_context (req_id , request )
760818 context = await _analyze_model_requirements (req_id , context , request )
761819
@@ -788,7 +846,10 @@ async def _process_request_refactored(
788846 context ['parsed_model_list' ],
789847 check_client_disconnected
790848 )
791-
849+
850+ # 优化:在提交提示前再次检查客户端连接,避免不必要的后台请求
851+ check_client_disconnected ("提交提示前最终检查" )
852+
792853 await page_controller .submit_prompt (prepared_prompt , check_client_disconnected )
793854
794855 # 响应处理仍然需要在这里,因为它决定了是流式还是非流式,并设置future
0 commit comments