web-dev-qa-db-fra.com

"RuntimeError: cette boucle d'événement est déjà en cours d'exécution"; débogage aiohttp, asyncio et IDE "spyder3" en python 3.6.5

J'ai du mal à comprendre pourquoi j'obtiens l'erreur d'exécution "RuntimeError: cette boucle d'événements est déjà en cours d'exécution". J'ai essayé d'exécuter des extraits de code à partir de " https://aiohttp.readthedocs.io/en/stable/ " mais je continue à avoir le même problème. 

Extrait de code du didacticiel:


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 de didacticiel (lors de l'exécution du code de spyder IDE):


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

<!doctype html>"

... (plus de HTML)


Extrait de code personnel (ne provenant pas du didacticiel 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 __== '__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 de code personnel (lors de l'exécution du code de spyder IDE):


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 "," adjust_previous_close ":" 14.3600 "," previous_close_date ":" 2018-05-07 "," symbol ":" SURF "," trading_halted ": false," has_traded ": true," last_trade_price_source ":" consolidée " , "updated_at": "2018-05-08T20: 01: 21Z", "instrument": " https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}


RÉSULTATS de l'extrait personnel (lors de l'exécution de la commande "python personal_snippet.py" de cmd):


{"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 "," adjust_previous_close ":" 14.3600 "," previous_close_date ":" 2018-05-07 "," symbol ":" SURF "," trading_halted ": false," has_traded ": true," last_trade_price_source ":" consolidée " , "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 ", "just_previous_close": "14.3600", "previous_close_date": "2018-05-07", "symbol": "SURF", "trading_halted": false, "has_traded": true, "last_trade_price_source": "consolidé", "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'EDI de Spyder.  


J'ai deux questions:

  1. Pourquoi ai-je cette erreur? Il semble que les autres personnes ne rencontrent pas cette erreur lors de l'exécution du code du didacticiel. (Potentiellement répondu: BOGUE POSSIBLE DANS SPYDER3)

    Cela ne semble se produire que dans l'EDI de Spyder. J'ai lancé les deux extraits de code depuis l'invite cmd et aucune erreur n'est apparue. Merci à @MikhailGerasimov pour cette suggestion. 

  2. Étant donné que j’ai deux commandes d’impression (dans le deuxième fragment de code) et qu’un seul ensemble de "données" a été imprimé, alors pourquoi les données ne retournent-elles pas à l’appel initial (results = loop.run_until_complete (get_async_urls ( urls))) (réponse potentielle: BOGUE POSSIBLE DANS SPYDER3)

    Cela semble ne se produire que dans l'EDI de Spyder. J'ai lancé le deuxième extrait de code depuis l'invite cmd et les deux empreintes sont apparues. Merci à @MikhailGerasimov pour cette suggestion.




Les deux questions ont (probablement) été répondues. Je vais faire référence à cette question lorsque je soumets un problème à Spyder IDE. Je continuerai à mettre à jour cette information au fur et à mesure que les choses évolueront du côté des espions. S'ils reviennent et disent que le problème ne les concerne pas, alors je rouvrirai les questions dans un format légèrement différent. 

Merci pour l'aide!




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




5

Le problème semble être lié au IDE utilisé (Spyder3). J'ai essayé d'utiliser le code avec PyCharm Community Edition hier soir. Le code a fonctionné sans problèmes. 

J'ai soumis un bug à Spyder3. 

2
Ryan Baumgartner

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

1
Dylan_Larkin

J'ai le même problème avec Spyder, la seule solution qui a fonctionné pour moi a été d'utiliser nest_asyncio

installer le nest_asyncio en utilisant la commande

pip install nest_asyncio

Ajoutez les lignes ci-dessous dans votre fichier

import nest_asyncio
nest_asyncio.apply()

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


Des docs 

De par sa conception, asyncio ne permet pas à sa boucle d'événements d'être imbriquée. 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: cette boucle d’événement est déjà en cours d’exécution».

Le problème apparaît dans divers environnements, tels que les serveurs Web, les applications GUI Et les blocs-notes Jupyter.

Ce module corrige asyncio pour permettre l’utilisation imbriquée de asyncio.run et de Loop.run_until_complete.

1
Rajshekar Reddy