Python asyncio循环中如何实现异步调用无需等待前次操作完成
异步并发连接实现方案
修改要求结论
connect_to_server和外层的主执行函数都需要改为异步实现- 不要在循环内直接
await单个连接任务,统一等待所有任务执行的环节才需要使用await
现有代码问题说明
你当前编写的代码依然是串行执行的,存在两个核心问题:
- 循环内直接写
await connect_to_server(client),每次迭代都会阻塞等待本次连接完成,才会进入下一次迭代启动新连接,本质和原来的同步循环没有区别 connect_to_server还是同步函数,内部用的time.sleep是阻塞调用,就算加了await也不会触发异步调度,反而会报错
正确实现代码
import asyncio # 改造为异步函数,添加async关键字 async def connect_to_server(client_id): print(client_id) # 替换阻塞的time.sleep为异步非阻塞实现 await asyncio.sleep(3) # 实际业务中所有网络IO、文件IO操作都要替换为对应的异步API async def main(): clients = [1, 2, 3, 4] # 先批量创建所有连接任务,不会阻塞等待执行 tasks = [connect_to_server(client) for client in clients] # 统一等待所有任务执行完成,此处添加await await asyncio.gather(*tasks) asyncio.run(main())
效果说明
改造后所有连接任务几乎同时启动,总执行耗时仅约3秒,远低于串行执行的12秒,符合你不需要等待上一个连接完成就启动下一个的需求。
内容的提问来源于stack exchange,提问作者user12797847
相关产品推荐
相关产品推荐

