From the docs it seems the recommended way to kickstart a asyncio application is to use asyncio.run()
, so my application looks like this:
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())
This infinite loop at the end of async_main()
feels very wrong. In other languages, there is where I would call the event loop forever. So I tried this:
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()
The problem here is this will fail with an error of the sorts RuntimeError: no running event loop
when I call asyncio.create_task()
inside my functions, even though the event loop is created and registered on the thread.
What is the pythonic, one way of sleeping forever on the asyncio
event loop?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…