Python asyncio并发任务调度问题:如何在调用f和g后启动count_timer并保持三者并发执行
解决方案:让f、g和count_timer并发执行
嘿,我来帮你调整代码实现三个任务的并发!先看看你原代码里的几个小问题,再给出修改方案:
原代码的核心问题
- 任务执行顺序不对:你在
main里先await task_g再await task_f,这会让g和f顺序执行(先等g跑完20秒,再跑f的10秒),而且count_timer要等前两个都结束才启动,完全没并发。 - 阻塞了事件循环:
count_timer里用了time.sleep(1),这是同步阻塞函数,会把整个asyncio事件循环卡住,导致其他任务也没法运行,必须换成异步的await asyncio.sleep(1)。
修改后的完整代码
import asyncio from time import sleep from signal import SIGINT, SIGTERM, signal async def f(): print("Got in F") await asyncio.sleep(10) print("Finished Sleep in F") return "f" async def g(): print("Got in G") await asyncio.sleep(20) print("Finished Sleep in G") return "g" async def count_timer(): for i in range(20): print(i) await asyncio.sleep(1) # 替换成异步sleep,避免阻塞事件循环 async def main(): # 1. 先创建并启动f和g的任务(create_task会立即调度任务执行) task_f = asyncio.create_task(f()) task_g = asyncio.create_task(g()) # 2. 启动count_timer任务(此时f和g已经在运行了) task_counter = asyncio.create_task(count_timer()) # 3. 同时等待三个任务全部完成,实现并发 await asyncio.gather(task_f, task_g, task_counter) if __name__ == "__main__": import time s = time.perf_counter() asyncio.run(main()) elapsed = time.perf_counter() - s print(f"{__file__} executed in {elapsed:0.2f} seconds.")
关键调整说明
- 异步sleep替换:把
count_timer里的sleep(1)改成await asyncio.sleep(1),这样计时器不会阻塞其他任务的执行。 - 任务并发调度:用
asyncio.create_task创建任务后,任务会立即加入事件循环开始运行,不需要先await。最后用asyncio.gather一次性等待所有任务完成,确保三个任务同时执行。 - 执行时间优化:修改后总执行时间大概在20秒左右(和最长的任务g、count_timer耗时一致),而原代码需要50秒左右,完美实现了并发效果。
内容的提问来源于stack exchange,提问作者Lucas Delfino Nogueira
相关产品推荐
相关产品推荐

