gpt4 book ai didi

python - 永远运行 asyncio 事件循环的 pythonic 方式是什么?

转载 作者:行者123 更新时间:2023-12-04 00:13:48 25 4
gpt4 key购买 nike

the docs 看来,启动 asyncio 应用程序的推荐方法是使用 asyncio.run() ,所以我的应用程序如下所示:

async def async_main():
# Everything here can use asyncio.create_task():
o = ObjectThatMustBeKeptReferenced()
create_tasks_and_register_callbacks(o)

# Wait forever, ugly:
while True:
await asyncio.sleep(10000)

asyncio.run(async_main())
async_main() 结尾的这个无限循环感觉很不对劲。在其他语言中,我会永远调用事件循环。所以我试过这个:
def main():
loop = asyncio.get_event_loop()

# Everything here can use asyncio.create_task():
o = ObjectThatMustBeKeptReferenced()
create_tasks_and_register_callbacks(o)

# Wait forever, pretty:
loop.run_forever()

main()
这里的问题是,当我在我的函数中调用 RuntimeError: no running event loop 时,即使在线程上创建并注册了事件循环,这也会失败并出现 asyncio.create_task() 类型的错误。
什么是 pythonic,在 asyncio 事件循环中永远休眠的一种方式?

最佳答案

您可以简单地将 sleep 循环更改为从未设置的临时事件:

# wait forever
await asyncio.Event().wait()
如果需要,您可以轻松修改它以将事件存储到变量中并将其作为关闭信号传播。
另一种选择是让创建任务的函数返回它创建的任务,在这种情况下,即使(或正是因为)它们永远不会完成,您也可以等待它们:
async def async_main():
o = ObjectThatMustBeKeptReferenced()
tasks = create_tasks_and_register_callbacks(o)
# wait forever, or until a task raises
await asyncio.gather(*tasks)
虽然这并没有清楚地传达永远循环的意图,但它的优点是如果任何任务引发未处理的异常,它将停止程序(并传播异常)。

关于python - 永远运行 asyncio 事件循环的 pythonic 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65684730/

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