如何在所有任务完成后终止 python asyncio event_loop
How to terminate a python asyncio event_loop when all tasks have completed
好的,基本上我需要澄清 RE:如何使用 asyncio.run_until_complete(Future)
函数。
在我的循环中添加 3 个任务后,我尝试使用 asyncio.wait()
函数创建一个 Future
"done callback"。
在下面的代码中,我的 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')
这就是 gather
的用途。摆脱你的 completed
未来,并以这种方式使用 gather
:
event_loop.run_until_complete(asyncio.gather(task_A, task_B, task_C))
您在此处编写的内容创建了一个 Future
并对其进行了配置,以便在未来完成时,然后 它将等待任务。但是你永远不会完成未来(例如 set_result()
)。 Future
并不是关于 运行 异步的事情。它只是一个表示 "some future value that will be provided by someone eventually calling set_result()
or raising an exception with set_exception()
." 的数据结构,事实证明它通常对异步工作很有用,但它本身并不是协程。
好的,基本上我需要澄清 RE:如何使用 asyncio.run_until_complete(Future)
函数。
在我的循环中添加 3 个任务后,我尝试使用 asyncio.wait()
函数创建一个 Future
"done callback"。
在下面的代码中,我的 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')
这就是 gather
的用途。摆脱你的 completed
未来,并以这种方式使用 gather
:
event_loop.run_until_complete(asyncio.gather(task_A, task_B, task_C))
您在此处编写的内容创建了一个 Future
并对其进行了配置,以便在未来完成时,然后 它将等待任务。但是你永远不会完成未来(例如 set_result()
)。 Future
并不是关于 运行 异步的事情。它只是一个表示 "some future value that will be provided by someone eventually calling set_result()
or raising an exception with set_exception()
." 的数据结构,事实证明它通常对异步工作很有用,但它本身并不是协程。