Cómo solucionar asyncio RuntimeError: This event loop is already running

Problema

Mientras intentas ejecutar una función async def usando asyncio.run_until_complete(), p. ej.

asyncio_example.py
import asyncio
asyncio.get_event_loop().run_until_complete(asyncio.sleep(1))

ves un mensaje de error como

asyncio_runtimeerror_example.txt
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 running

Solución

En lugar de usar loop.run_until_complete(), usa asyncio.create_task() para ejecutar la corrutina:

asyncio_create_task.py
future = asyncio.get_event_loop().create_task(asyncio.sleep(1))

Opcionalmente, puedes hacer await del future para esperar a que la corrutina termine:

asyncio_await_future.py
await future

La razón para esto es que loop.run_until_complete() está diseñado para código sincrónico y siempre iniciará el loop, por lo tanto fallará si el loop ya está ejecutándose.

Típicamente, este error ocurre si estás ejecutando código desde un contexto como un Jupyter Notebook, que inicia un event loop internamente. Podrías necesitar cambiar tu código si quieres ejecutarlo en otro contexto como un script de Python puro.


Echa un vistazo a artículos similares por categoría: Python