10 votes

"RuntimeError : This event loop is already running" ; débogage de aiohttp, asyncio et de l'IDE "spyder3" en python 3.6.5

J'ai du mal à comprendre pourquoi je reçois l'erreur "RuntimeError : This event loop is already running". J'ai essayé d'exécuter des bouts de code de " https://aiohttp.readthedocs.io/en/stable/ "Cependant, je rencontre toujours le même problème.

Extrait de code du tutoriel :


import aiohttp
import asyncio
import async_timeout

async def fetch(session, url):
    async with async_timeout.timeout(10):
        async with session.get(url) as response:
            return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

RÉSULTATS de l'extrait du tutoriel (en exécutant le code à partir de l'IDE spyder) :


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

<!doctype html>"

... (plus d'html)


Extrait de code personnel (ne provenant pas du tutoriel référencé ci-dessus) :


import aiohttp
import asyncio
import time

urls = ['https://api.robinhood.com/quotes/c4f6720a-0364-4e7b-8c41-705696759e1a/']

async def fetch(client, url):
    async with client.request('get', url) as response:
        if response.status == 200:
            data = await response.text()
        else:
            data = []
        print(data)
        return(data)

async def get_async_urls(urls):
    async with aiohttp.ClientSession() as client:
        return await asyncio.gather(*(fetch(client, url) for url in urls))

if __name__ == '__main__':
    t0 = time.time()
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(get_async_urls(urls))
    print(results)
    t1 = time.time()
    total_time = t1-t0
    loop.close()

RÉSULTATS de l'extrait personnel (en exécutant le code de l'IDE Spyder) :


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

{"ask_price":"14.9000","ask_size":100,"bid_price":"14.0100","bid_size":100,"last_trade_price":"14.7900","last_extended_hours_trade_price":"14.7900","previous_close":"14.3600","adjusted_previous_close":"14. 3600","previous_close_date":"2018-05-07","symbol":"SURF","trading_halted":false,"has_traded":true,"last_trade_price_source":"consolidated","updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}


RÉSULTATS du snippet personnel (en exécutant depuis cmd "python personal_snippet.py") :


{"ask_price":"14.9000","ask_size":100,"bid_price":"14.0100","bid_size":100,"last_trade_price":"14.7900","last_extended_hours_trade_price":"14.7900","previous_close":"14.3600","adjusted_previous_close":"14. 3600","previous_close_date":"2018-05-07","symbol":"SURF","trading_halted":false,"has_traded":true,"last_trade_price_source":"consolidated","updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "} ['{"ask_price":"14.9000","ask_size":100,"bid_price":"14.0100","bid_size":100,"last_trade_price":"14.7900","last_extended_hours_trade_price":"14.7900","previous_close":"14.3600","adjusted_previous_close":"14. 3600","previous_close_date":"2018-05-07","symbol":"SURF","trading_halted":false,"has_traded":true,"last_trade_price_source":"consolidated","updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}']


Les résultats ci-dessus semblent indiquer que le problème est lié à l'IDE Spyder.


J'ai deux questions :

  1. Pourquoi est-ce que je reçois cette erreur ? Il semble que d'autres personnes n'obtiennent pas cette erreur en exécutant le code du tutoriel. (Réponses possibles : BUG POSSIBLE DANS SPYDER3)

    Cela semble se produire uniquement dans l'IDE spyder. J'ai exécuté les deux bouts de code à partir de l'invite cmd et aucune erreur n'est apparue. Merci à @MikhailGerasimov pour la suggestion.

  2. Étant donné que j'ai deux commandes d'impression (dans le deuxième extrait de code) et qu'un seul ensemble de "données" a été imprimé, alors pourquoi les données ne sont pas renvoyées à l'appel original (results = loop.run_until_complete(get_async_urls(urls)))) (Réponses possibles : BUG POSSIBLE DANS SPYDER3)

    Cela semble se produire uniquement dans l'IDE de Spyder. J'ai exécuté le deuxième extrait de code à partir de l'invite cmd et les deux impressions sont apparues. Merci à @MikhailGerasimov pour la suggestion.




LES DEUX QUESTIONS ONT (probablement) ÉTÉ RÉPONDUES. Je ferai référence à cette question lorsque je soumettrai un problème à spyder IDE. Je continuerai à mettre à jour cette question au fur et à mesure que les choses évoluent du côté de Spyder. S'ils reviennent et disent que le problème ne vient pas d'eux, alors je rouvrirai les questions dans un format légèrement différent.

Merci pour votre aide !




Lien vers la soumission du problème référencé dans le github de Spyder IDE : https://github.com/spyder-ide/spyder/issues/7096




10voto

Reddy Points 280

J'ai le même problème avec Spyder, La seule solution qui a fonctionné pour moi était d'utiliser nid_asyncio

installez le nest_asyncio en utilisant la commande

pip install nest_asyncio

Ajoutez les lignes suivantes dans votre fichier

import nest_asyncio
nest_asyncio.apply()

Et le problème doit être réglé.


Extrait de la documentation

De par sa conception, Asyncio ne permet pas l'imbrication de sa boucle d'événements. Cela pose un problème pratique : dans un environnement où la boucle d'événements est déjà en cours d'exécution, il est impossible d'exécuter des tâches et d'attendre le résultat. Si vous essayez de le faire, vous obtiendrez l'erreur "RuntimeError : This event loop is already running".

Le problème apparaît dans différents environnements, tels que les serveurs web, les interfaces graphiques et les carnets de notes Jupyter.

Ce module corrige asyncio pour permettre l'utilisation imbriquée d'asyncio.run et de loop.run_until_complete.

3voto

Le problème semble être lié à l'IDE utilisé (Spyder3). J'ai essayé d'exécuter le code avec PyCharm community edition hier soir. Le code s'est exécuté sans problème.

J'ai soumis un bug à Spyder3.

1voto

Dylan_Larkin Points 305

J'ai peut-être eu de la chance, mais j'ai rétrogradé Tornade. Voir "Impossible d'invoquer asyncio event_loop après la mise à jour de tornado 5.0"

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