从文档上看,启动异步应用程序的推荐方式是使用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()
问题在于,当我在我的函数中调用asyncio.create_task()
时,即使事件循环已经创建并在线程上注册,也会出现类似RuntimeError: no running event loop
的错误。
如何在asyncio
事件循环上永远睡眠的Pythonic方式是什么?
asyncio.run()
会返回,我的程序就会退出,无限任务也不再被调度。 - lvellaasyncio.gather
的等效操作是隐式完成的,但显然asyncio.run
并没有这样做,也许我想到的是调用asyncio.async(async_main())
然后永久运行,但我已经有一段时间没有使用Python异步了。对我来说,显式调用gather
似乎是最好的选择。 - Tadhg McDonald-Jensenasyncio.async()
?也许您输错了,因为没有这样的函数。 - lvella