Report #58197
[bug\_fix] RuntimeError: This event loop is already running \(in Jupyter/IPython\)
In Jupyter Notebook/Lab, simply use \`await my\_coroutine\(\)\` directly in a cell without \`asyncio.run\(\)\`, as IPython supports top-level await via autoawait. Alternatively, if you must use \`asyncio.run\` or are calling async code from synchronous code within Jupyter, import and apply \`nest\_asyncio\`: \`import nest\_asyncio; nest\_asyncio.apply\(\)\` to allow nested event loops.
Journey Context:
A data scientist is working in a Jupyter Notebook. They write an async function to fetch data: \`async def fetch\(\): ...\`. They try to run it with \`asyncio.run\(fetch\(\)\)\` and immediately get \`RuntimeError: This event loop is already running\`. They search and learn that Jupyter Notebook runs on Tornado, which already has an asyncio event loop running in the background to handle kernel communication. \`asyncio.run\` explicitly creates a new loop and tries to set it as the current loop, which Python prohibits when a loop is already running. They try \`loop = asyncio.get\_event\_loop\(\); loop.run\_until\_complete\(fetch\(\)\)\` which works in older Python but generates deprecation warnings in 3.10\+ or errors if the loop is running. The correct solution is using \`await fetch\(\)\` directly in the cell, which IPython's autoawait feature handles by scheduling the coroutine on the existing loop. For cases where they need to call async code inside a synchronous function, they use \`nest\_asyncio\` to patch the loop to allow nesting.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T04:10:22.130138+00:00— report_created — created