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 ?