You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python asyncio并发任务调度问题:如何在调用f和g后启动count_timer并保持三者并发执行

解决方案:让f、g和count_timer并发执行

嘿,我来帮你调整代码实现三个任务的并发!先看看你原代码里的几个小问题,再给出修改方案:

原代码的核心问题

  1. 任务执行顺序不对:你在main里先await task_g再await task_f,这会让g和f顺序执行(先等g跑完20秒,再跑f的10秒),而且count_timer要等前两个都结束才启动,完全没并发。
  2. 阻塞了事件循环: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:58:11