Report #63552
[bug\_fix] asyncio.run\(\) cannot be called from a running event loop in Jupyter/IPython
Use 'await main\(\)' directly in the Jupyter cell \(since IPython 7\+ supports top-level await\), or use 'asyncio.get\_running\_loop\(\).create\_task\(main\(\)\)' instead of asyncio.run\(\). This leverages the already-running event loop rather than trying to spawn a new one.
Journey Context:
Developer writes an async application with an async main\(\) function. In a standalone script, they use 'asyncio.run\(main\(\)\)' which works perfectly. They then switch to a Jupyter Notebook to prototype, paste the same code into a cell, and execute. It immediately raises 'RuntimeError: asyncio.run\(\) cannot be called from a running event loop'. The developer checks 'asyncio.get\_event\_loop\(\)' and sees a loop is indeed running. They realize that Jupyter/IPython kernel runs an event loop in the background thread to handle cell execution and async cell magic. Since Python 3.7, asyncio.run\(\) explicitly creates a new loop and sets it as the running loop, which fails if one is already running. The solution is to use 'await main\(\)' directly in the cell, which IPython's async-aware kernel handles by scheduling the coroutine on the existing loop.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T13:09:38.283050+00:00— report_created — created