Wie man asyncio RuntimeError behebt: This event loop is already running
Problem
Beim Versuch, eine async def-Funktion mit asyncio.run_until_complete() auszuführen, z.B.
import asyncio
asyncio.get_event_loop().run_until_complete(asyncio.sleep(1))sehen Sie eine Fehlermeldung wie
Cell In[3], line 15
12 raise
14 # Usage example:
---> 15 asyncio.get_event_loop().run_until_complete(asyncio.sleep(1))
File /usr/lib/python3.12/asyncio/base_events.py:663, in BaseEventLoop.run_until_complete(self, future)
652 """Run until the Future is done.
653
654 If the argument is a coroutine, it is wrapped in a Task.
(...)
660 Return the Future's result, or raise its exception.
661 """
662 self._check_closed()
--> 663 self._check_running()
665 new_task = not futures.isfuture(future)
666 future = tasks.ensure_future(future, loop=self)
File /usr/lib/python3.12/asyncio/base_events.py:622, in BaseEventLoop._check_running(self)
620 def _check_running(self):
621 if self.is_running():
--> 622 raise RuntimeError('This event loop is already running')
623 if events._get_running_loop() is not None:
624 raise RuntimeError(
625 'Cannot run the event loop while another loop is running')
RuntimeError: This event loop is already runningLösung
Verwenden Sie statt loop.run_until_complete() asyncio.create_task(), um die Koroutine auszuführen:
future = asyncio.get_event_loop().create_task(asyncio.sleep(1))Optional können Sie den Future awaiten, um auf den Abschluss der Koroutine zu warten:
await futureDer Grund dafür ist, dass loop.run_until_complete() für synchronen Code gedacht ist und die Schleife immer starten wird, daher wird es fehlschlagen, wenn die Schleife bereits läuft.
Typischerweise tritt dieser Fehler auf, wenn Sie Code aus einem Kontext wie einem Jupyter-Notebook ausführen, das intern eine Event-Loop startet. Möglicherweise müssen Sie Ihren Code ändern, wenn Sie ihn in einem anderen Kontext wie einem reinen Python-Skript ausführen möchten.