asyncio.run is the modern way to start an event loop. run_until_complete is lower-level.
1import asyncio23async def main():4 await asyncio.sleep(1)5 return "Done"67# Modern (Python 3.7+) — recommended8result = asyncio.run(main())9print(result) # "Done"1011# Legacy — manual loop management12loop = asyncio.get_event_loop()13task = loop.create_task(main())14loop.run_until_complete(task)15result = task.result()16loop.close() # Don't forget!
Key differences:
run creates a new loop, runs, then closes it.run_until_complete uses existing loop.run handles signal registration.run sets running loop context.When to use run_until_complete: