web-dev-qa-db-fra.com

asyncio: RuntimeError cette boucle d'événements 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 en python

Mais dans mon cas, je ne lance la boucle d'événements qu'une seule fois, au moins pour autant que je puisse voir. Cet exemple suit également directement les instructions ici :

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()

Cela affiche 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 de résultats reste indéfinie.

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

4
lhk

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

5
kayoz