Report #83602
[bug\_fix] RuntimeError: This event loop is already running \(in Jupyter/IPython\)
Use \`await func\(\)\` directly in the Jupyter cell \(since IPython runs an event loop\), or install and apply \`nest\_asyncio\` \(\`import nest\_asyncio; nest\_asyncio.apply\(\)\`\). Root cause: Jupyter Notebook/IPython \(7.0\+\) runs an asyncio event loop in the background to handle async cell execution. Calling \`asyncio.run\(\)\` attempts to create and run a new event loop, which Python forbids if a loop is already active in the current thread.
Journey Context:
You're prototyping an async API client in a Jupyter notebook. You write \`async def fetch\(\): ...\` using \`aiohttp\`. Following the standard Python docs, you end the cell with \`asyncio.run\(fetch\(\)\)\`. Running the cell raises \`RuntimeError: This event loop is already running\`. You're confused because the exact same code works in a \`.py\` file. You search and find that Jupyter already has a loop running to allow \`await\` expressions in cells. You try removing \`asyncio.run\(\)\` and just writing \`await fetch\(\)\` in the cell, and it works perfectly. Later, you need to use a third-party library that internally calls \`asyncio.run\(\)\` inside its initialization function. You can't modify the library. You find the \`nest\_asyncio\` package, import it at the top of your notebook, run \`nest\_asyncio.apply\(\)\`, and the library now works because it patches the loop to allow nested execution.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T22:54:44.354998+00:00— report_created — created