RuntimeError: este bucle de eventos ya se está ejecutando en python

Creo que recibo este error porque mi código llamaasyncio.get_event_loop().run_until_complete(foo()) dos veces. Una vez defoo() y la segunda vez desde la función llamada porfoo(). Mi pregunta es entonces: ¿por qué debería ser esto un problema? ¿Por qué debería importarme que este ciclo se esté ejecutando?

Se realizó una edición de esta pregunta que, a mi juicio, la oscureció (algunas personas prefieren seguir las reglas sin entenderlas, por lo que se eliminó una palabra "ilegal" del título). Desafortunadamente, esto crea confusión.

No me sorprende el hecho de que se genere el error. Puedo rastrearlo hasta elasyncio fuente y ver que los autores de esta biblioteca querían hacerlo de esta manera, no hay misterio allí. La parte desconcertante es la razón por la cual los autores de la biblioteca decidieron que es ilegal solicitar al bucle de eventos que ejecute alguna función hasta que se complete cuando el bucle ya se está ejecutando.

Podemos reducir el problema a solo dos llamadas de este tipo, y a través del análisis de casos veremos que estas son las tres posibilidades:

Ninguna de las dos funciones termina nunca.Una de las funciones finalmente termina.Ambas funciones terminan eventualmente.

Ahora, ¿hay algún comportamiento sensato que aborde los tres casos? Para mí, es obvio que hay, o, tal vez, hay múltiples comportamientos sanos posibles aquí. Por ejemplo:

Nada especial, la ejecución de ambas funciones está intercalada y siguen ejecutándose para siempre, tal como se esperaba.El bucle no devuelve el control al código después de la primera instancia derun_until_complete() hasta que se complete la segunda función (por lo tanto, no hay código despuésrun_until_complete() será ejecutado.Una vez que finaliza la última función, el bucle devuelve el control al primer objeto de código que invocórun_until_complete ignorando todos los otros sitios de invocación.

Ahora, puedo entender que este comportamiento puede no ser algo que todos desearían. Pero, dado que esta biblioteca decidió dar a los programadores control sobre el inicio / detención del ciclo de eventos, también debería cumplir con las consecuencias de tales decisiones. Hacer que sea un error iniciar el mismo ciclo varias veces impide que el código de la biblioteca lo haga, lo que reduce la calidad y la utilidad de las bibliotecas que utilizanasyncio (que es el caso de, por ejemplo,aiohttp)

Respuestas a la pregunta(1)

Su respuesta a la pregunta