首页 > 解决方案 > 在 python asyncio 中,是否可以在不等待完成的情况下调用另一个任务?

问题描述

目前task1需要等待task2完成。现在我需要task2看起来像另一个线程而不影响task1的执行,如何实现呢?

async def task2():
    await asyncio.sleep(3)
    print("task2")


async def task1():
    await task2()
    print("task1")
async def main(loop):
    task = loop.create_task(task1())
    await task

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(loop))
    loop.close()

标签: pythonpython-asyncio

解决方案


您可以使用asyncio.gather()它同时运行您传递给它的每个任务。每个协程中的代码同步执行,直到到达一个await关键字,将控制权传递回事件循环。

如果您想task2被“启动” task1,您可以使用asyncio.Event等待,直到在task2中设置了一个事件,然后在task1中设置该事件。

请参阅修改后的示例。两个任务同时使用asyncio.gather. 但task2在事件从task1.

import asyncio

async def task2(event):
    print("starting task2")
    await event.wait()
    print("event set")
    await asyncio.sleep(3)
    print("task2 end")


async def task1(event):
    print("starting task1")
    event.set()
    await asyncio.sleep(5)
    print("task1 end")

async def main(loop):
    event = asyncio.Event()

    await asyncio.gather(
        task1(event),
        task2(event)
    )

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(loop))
    loop.close()

我添加了一些打印语句,一个 3 秒睡眠到task2,一个 5 秒睡眠到task1。由于它们同时运行,输出将是:

starting task1
starting task2
event set
task2 end
task1 end

推荐阅读