wake-up-neo.com

"RuntimeError: Diese Ereignisschleife läuft bereits"; debuggen von aiohttp, asyncio und IDE "spyder3" in Python 3.6.5

Ich habe Schwierigkeiten zu verstehen, warum ich den Laufzeitfehler "RuntimeError: Diese Ereignisschleife läuft bereits" erhalte. Ich habe versucht, Codeausschnitte von " https://aiohttp.readthedocs.io/de/stable/ " auszuführen, aber ich bekomme immer wieder dasselbe Problem. 

Code-Snippet aus dem Tutorial:


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

ERGEBNISSE aus dem Tutorial-Snippet (beim Ausführen von Code aus der Spyder-IDE):


RuntimeError: Diese Ereignisschleife läuft bereits

<!doctype html>"

... (mehr html)


Code für persönlichen Code (nicht aus dem oben angegebenen Tutorial):


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

ERGEBNISSE aus dem persönlichen Snippet (während Code von der Spyder-IDE ausgeführt wird):


RuntimeError: Diese Ereignisschleife läuft bereits

{"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 ":" , "updated_at": "2018-05-08T20: 01: 21Z", "instrument": " https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}


ERGEBNISSE aus persönlichem Snippet (beim Ausführen von 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 "," adjust_previous_close ":" 14.3600 "," previous_close_date ":" 2018-05-07 "," Symbol ":" SURF "," trading_halted ": false," has_traded ": true," last_trade_price_source ":" , "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": "konsolidiert", "updated_at": "2018-05-08T20: 01: 21Z", "instrument": " https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650 -55be2396f814/ "} ']


Die obigen Ergebnisse deuten darauf hin, dass das Problem mit der Spyder IDE zusammenhängt.  


Ich habe zwei Fragen:

  1. Warum erhalte ich diesen Fehler? Es scheint, dass andere Benutzer diesen Fehler nicht erhalten, wenn Sie den Tutorial-Code ausführen. (Möglicherweise geantwortet: MÖGLICHER FEHLER IN SPYDER3)

    Dies scheint nur in der Spyder-IDE zu passieren. Ich habe beide Codeausschnitte von der cmd-Eingabeaufforderung ausgeführt und es ist kein Fehler aufgetreten. Danke an @MikhailGerasimov für den Vorschlag. 

  2. Angenommen, ich habe zwei Druckbefehle (im zweiten Codeausschnitt), und es wurde nur ein Satz von "Daten" gedruckt. Dann Warum werden Daten nicht zum ursprünglichen Aufruf (Ergebnisse = loop.run_until_complete (get_async_urls ( Urls))) (Potenziell beantwortet: MÖGLICHER FEHLER IN SPYDER3)

    Dies scheint nur in der Spyder-IDE der Fall zu sein. Ich habe das zweite Codefragment in der cmd-Eingabeaufforderung ausgeführt und beide Drucke erschienen. Danke an @MikhailGerasimov für den Vorschlag.




BEIDEN FRAGEN WURDEN (wahrscheinlich) BEANTWORTET. Ich werde auf diese Frage verweisen, wenn ich ein Problem an die spyder IDE reiche. Ich werde dies weiterhin aktualisieren, da sich die Dinge auf der Spyder-Seite weiterentwickeln. Wenn sie zurückkommen und sagen, dass das Problem nicht bei ihnen liegt, werde ich die Fragen in einem etwas anderen Format wieder öffnen. 

Danke für die Hilfe!




Link zu der Vorlage des referenzierten Problems in Spyder IDE github: https://github.com/spyder-ide/spyder/issues/7096




5

Das Problem scheint mit dem verwendeten IDE (Spyder3) zu zusammenhängen. Ich habe gestern Abend versucht, den Code mit der PyCharm Community Edition auszuführen. Der Code lief ohne Probleme. 

Ich habe einen Fehler bei Spyder3 eingereicht. 

2

Vielleicht hatte ich Glück, aber ich habe Tornado herabgestuft. Siehe "Kann asyncio event_loop nach Update von Tornado 5.0 nicht aufrufen"

1
Dylan_Larkin

Ich habe das gleiche Problem mit Spyder. Die einzige Lösung, die für mich funktionierte, war die Verwendung von nest_asyncio

installieren Sie das nest_asyncio mit dem Befehl

pip install nest_asyncio

Fügen Sie die folgenden Zeilen in Ihre Datei ein

import nest_asyncio
nest_asyncio.apply()

Und das Problem muss behoben werden.


Aus den Unterlagen 

Asyncio lässt es nicht zu, dass die Ereignisschleife verschachtelt wird. Dies stellt ein praktisches Problem dar: Wenn in einer Umgebung, in der die Ereignisschleife bereits läuft, ist es nicht möglich, Aufgaben auszuführen und auf das Ergebnis zu warten. Wenn Sie dies versuchen, wird der Fehler "RuntimeError: Diese Ereignisschleife läuft bereits" angezeigt.

Das Problem tritt in verschiedenen Umgebungen auf, z. B. Webservern, GUI-Anwendungen (.____.) Und in Jupyter-Notebooks.

Dieses Modul aktualisiert asyncio, um die verschachtelte Verwendung von asyncio.run und Loop.run_until_complete zu ermöglichen.

1
Rajshekar Reddy