10 votes

asyncio : RuntimeError cette boucle d'événement est déjà en cours d'exécution

Cela semble être un problème courant, voir par exemple : RuntimeError : Cette boucle d'événement est déjà en cours d'exécution dans python

Mais dans mon cas, je ne lance la boucle d'événement qu'une seule fois, du moins pour autant que je puisse voir. De plus, cet exemple suit directement les instructions aquí :

import asyncio

loop = asyncio.get_event_loop()

async def coroutine():
    print("hey")
    await asyncio.sleep(1)
    print("ho")
    return 1

async def main():

    tasks = []
    for i in range(2):
        tasks.append(asyncio.ensure_future(coroutine()))
    await asyncio.gather(*tasks)

results = loop.run_until_complete(main())
loop.close()

Ceci imprime un message d'erreur, et la sortie des appels print() dans les coroutines :

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-1-f4a74fbfac46> in <module>
     16     await asyncio.gather(*tasks)
     17 
---> 18 results = loop.run_until_complete(asyncio.gather(*tasks))
     19 loop.close()

~/anaconda3/envs/keras_dev/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
    453         future.add_done_callback(_run_until_complete_cb)
    454         try:
--> 455             self.run_forever()
    456         except:
    457             if new_task and future.done() and not future.cancelled():

~/anaconda3/envs/keras_dev/lib/python3.6/asyncio/base_events.py in run_forever(self)
    407         self._check_closed()
    408         if self.is_running():
--> 409             raise RuntimeError('This event loop is already running')
    410         if events._get_running_loop() is not None:
    411             raise RuntimeError(

RuntimeError: This event loop is already running
hey
hey
ho
ho

Et la variable des résultats reste indéfinie.

Comment puis-je faire tourner une liste de coroutines et rassembler leurs sorties correctement ?

11voto

kayoz Points 535

J'ai également rencontré ce problème après avoir effectué quelques mises à niveau. Il s'avère que le tornado est très probablement le coupable. Si vous avez tornado>=5.0 alors l'exécution de boucles d'événements dans un bloc-notes provoque des conflits. Il y a une discussion détaillée aquí mais la solution, pour le moment, est simplement de rétrograder avec pip install tornado==4.5.3 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X