代码之家  ›  专栏  ›  技术社区  ›  Rajashree P

为什么我的异步任务没有在Python中并发运行?

  •  2
  • Rajashree P  · 技术社区  · 1 年前

    我使用Python的异步模块来同时运行多个任务。然而,我的任务似乎是按顺序运行的,而不是同时运行的,这导致了程序的延迟。我不知道为什么会发生这种事。

    您尝试过的内容: 我写了一个简单的脚本来测试asyncio的并发性。我希望这些任务并行运行,但它们似乎是一个接一个地运行的。以下是我正在使用的代码:

    import asyncio
    import time
    
    async def say_after(delay, message):
        await asyncio.sleep(delay)
        print(message)
    
    async def main():
        print(f"started at {time.strftime('%X')}")
    
        await say_after(2, 'hello')
        await say_after(1, 'world')
    
        print(f"finished at {time.strftime('%X')}")
    
    asyncio.run(main())
    
    

    我希望输出为:

    started at <time>
    hello
    world
    finished at <time>
    
    

    总延迟约为2秒。

    实际输出为:

    开始于<时间>
    你好
    世界
    以<时间>
    
    

    但是总延迟是大约3秒。

    2 回复  |  直到 1 年前
        1
  •  0
  •   Francisco Ríos    1 年前

    我认为问题可能是由于你如何等待每一个 say_after 主要功能中的任务顺序?要同时运行任务,您需要启动任务,然后一起等待,即使用 create_task 。像这样:

    async def main():
        print(f"started at {time.strftime('%X')}")
        task1 = asyncio.create_task(say_after(1, 'hello'));
        task2 = asyncio.create_task(say_after(2, 'world'));
        await task1;
        await task2;
        print(f"finished at {time.strftime('%X')}")
    

    其输出为:

    started at 00:15:37
    hello
    world
    finished at 00:15:39
    
        2
  •  0
  •   user24714692    1 年前

    您可以使用 create_task() :

    import asyncio
    import time
    
    async def say_after(delay, message):
        await asyncio.sleep(delay)
        print(message)
    
    async def main():
        print(f"started at {time.strftime('%X')}")
    
        task1 = asyncio.create_task(say_after(1, 'hello'))
        task2 = asyncio.create_task(say_after(2, 'world'))
    
        await task1
        await task2
    
        print(f"finished at {time.strftime('%X')}")
    
    asyncio.run(main())
    
    

    打印

    started at 21:09:43
    hello
    world
    finished at 21:09:45