Python异步函数脱离循环调用时无法接收服务端响应
问题分析与解决方法
核心问题:你在发送请求后立刻调用
server_connection.close(),此时服务端的响应还没来得及返回并触发回调,连接就被强制关闭了。原示例中的await asyncio.sleep(3)本质是给了足够时间让响应返回、回调执行,之后才执行关闭操作。解决方案:
- 可靠方案:等待响应回调触发后再关闭
利用asyncio.Event等待响应回调的信号,确保响应处理完成后再关闭连接,示例代码如下:from their_stack import create_endpoint import asyncio async def my_send_request(remote_ip, remote_port): response_received = asyncio.Event() def handle_response(response): # 这里添加你的响应处理逻辑 print("收到服务端响应:", response) response_received.set() server_connection = await create_endpoint(remote_ip, remote_port) # 注册响应回调函数(需确认库支持该注册方式) server_connection.set_response_callback(handle_response) server_connection.stack_send_request() # 等待响应处理完成 await response_received.wait() server_connection.close() def main(): asyncio.run(my_send_request("127.0.0.1", 9999)) - 临时方案:添加等待缓冲时间
如果暂时不清楚库的回调注册机制,可以先添加短暂等待,确保响应有足够时间返回并被处理(注意:该方案仅用于临时调试,不适合生产环境):async def my_send_request(remote_ip, remote_port): server_connection = await create_endpoint(remote_ip, remote_port) server_connection.stack_send_request() await asyncio.sleep(1) # 根据实际场景调整等待时长 server_connection.close()
- 可靠方案:等待响应回调触发后再关闭
内容的提问来源于stack exchange,提问作者kingvittu
相关产品推荐
相关产品推荐

