asyncio.run(coro)

This function always creates a new event loop and closes it at the end. It should be used as a main entry point for asyncio programs, and should ideally only be called once.

asyncio.Runner() A context manager that simplifies multiple async function calls in the same context.

async def main():
    await asyncio.sleep(1)
    print('hello')
 
with asyncio.Runner() as runner:
    runner.run(main())