gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:25:35 26 4
gpt4 key购买 nike

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

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

在下面的代码中,我的 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 future ,并以这种方式使用 gather:

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

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

关于python - 所有任务完成后如何终止python asyncio event_loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com