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?
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
.