如何在所有任务完成后终止python asyncio event_loop

时间:2017-08-01 21:50:07

标签: python python-3.x asynchronous concurrency python-asyncio

好的,基本上我需要澄清RE:如何使用asyncio.run_until_complete(Future)函数。

在我的循环中添加3个任务后,我尝试创建Future"完成回调"使用asyncio.wait()函数。

在以下代码中,我的event_loop.close()永远不会运行:

import asyncio

async def repeat_message(message, interval_seconds, max_iters=10):
    iters = 0
    while True:
        print(message)
        if iters >= max_iters:
            return 'Complete.'
        iters += 1
        await asyncio.sleep(interval_seconds)

if __name__ == "__main__":
    message_A = "xXxXxXxXxXxXxXxXxXxXx"
    interval_A = 0.5
    message_B = "I LOVE"
    interval_B = 1
    message_C = "EXPLOSIONS!"
    interval_C = 1.5

    event_loop = asyncio.get_event_loop()

    task_A = event_loop.create_task(repeat_message(message_A, interval_A))
    task_B = event_loop.create_task(repeat_message(message_B, interval_B))
    task_C = event_loop.create_task(repeat_message(message_C, interval_C))

    completed = event_loop.create_future()
    completed.add_done_callback(asyncio.wait([task_A, task_B, task_C], loop=event_loop))
    try:
        event_loop.run_until_complete(completed)
    finally:
        event_loop.close()
    # Never prints.
    print('DONE')

1 个答案:

答案 0 :(得分:4)

这是gather的用途。摆脱completed的未来,并以这种方式使用gather

event_loop.run_until_complete(asyncio.gather(task_A, task_B, task_C))

您在此处撰写的内容会创建Future并对其进行配置,以便在将来完成时,然后它将等待任务。但是你永远不会完成未来(例如set_result())。 Future并不是关于异步运行的。它只是一个数据结构,代表“最终调用set_result()或使用set_exception()提出异常的人将提供的未来价值。”事实证明这对于异步工作通常很有用,但它本身并不是一个协程。