Report #39876
[bug\_fix] RuntimeError: This event loop is already running
The error occurs when \`asyncio.run\(\)\` or \`loop.run\_until\_complete\(\)\` is called inside a context where an event loop is already active \(e.g., inside a Jupyter notebook kernel, an existing async application, or nested async calls\). The root cause is that Python 3.7\+ enforces one running loop per thread. The fix is to use \`await\` directly if already inside an async function, or use \`asyncio.get\_event\_loop\(\).create\_task\(\)\` if you must schedule from sync code inside a running loop. For Jupyter/IPython specifically, use \`nest\_asyncio\` \(\`import nest\_asyncio; nest\_asyncio.apply\(\)\`\) to allow nested loops, or refactor to use \`await\` expressions directly in notebook cells.
Journey Context:
You write a beautiful async script with \`async def main\(\): ...\` and at the bottom you put \`asyncio.run\(main\(\)\)\`. It works great when run as a script. Then you move the code into a Jupyter notebook cell. You run the cell and get 'RuntimeError: This event loop is already running'. You try removing \`asyncio.run\` and just calling \`await main\(\)\` but that only works in an async cell context. You try using \`get\_event\_loop\(\).run\_until\_complete\(\)\` but get the same error. You realize Jupyter already has a tornado loop running in the background. By installing \`nest-asyncio\` and applying the patch at the top of your notebook, or by restructuring your code to use \`await\` directly in the notebook's async environment, you allow the nested event loop to execute.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:24:22.858857+00:00— report_created — created