2017-05-05 1 views
0

Ich versuche, einen API-Aufruf von innerhalb meines Dienstes zu machen, und ich bin in Event-Loop-Probleme. Kann mir jemand helfen zu verstehen, was ich falsch mache?aiohttp: Aufruf von asyncio von einem laufenden web.Application: RuntimeError: Diese Ereignisschleife läuft bereits

Grundsätzlich möchte ich einen Dienst machen, der einige Berechnungen basierend auf Daten aus einem anderen Dienst ausführt.

ich diesen Code unten von einem cli nennen kann, aber nicht, wenn ich einen Web-App starten (dh) schlagen http://127.0.0.1:8080/add

loop = asyncio.get_event_loop() 
data = loop.run_until_complete(run_fetch(loop, 'http://google.com')) 

Beispielcode:

from aiohttp import web 
import aiohttp 
import asyncio 

async def add(request): 
    loop = asyncio.get_event_loop() 
    data = loop.run_until_complete(run_fetch(loop, 'http://google.com')) 
    return web.json_response(data) 


async def fetch(client, url): 
    async with client.get(url) as resp: 
     assert resp.status == 200 
     return await resp.text() 


async def run_fetch(loop, url): 
    async with aiohttp.ClientSession(loop=loop) as client: 
     html = await fetch(client, url) 
    return html 

app = web.Application() 
app.router.add_get('/add', add) 
web.run_app(app, host='127.0.0.1', port=8080) 

Ausnahme:

Fehlerbehandlungsanforderung Traceback (letzter Anruf zuletzt): Datei ".../aiohttp/web_protocol.py", Zeile 417, im Start bzw. = Ausbeute von self._request_handler (Anfrage)

Datei ".../aiohttp/web.py", Linie 289, in _HANDLE bzw. = Ausbeute von Handler (Anfrage)

File“.. ./sample.py "Zeile 11, in Daten hinzufügen = loop.run_until_complete (run_fetch (loop 'http://google.com'))

File" .../python3.6/asyncio/base_events.py“, Linie 454 , in run_until_complete self.run_forever()

Datei ".../python3.6/asyncio/base_events.py", Zeile 408, in run_forever raise Runtime (‚Diese Ereignisschleife bereits läuft‘)

Runtime: Diese Ereignisschleife bereits

Antwort

1

Die run_until_complete läuft ist der Weg, um einige Asynchron-Code aus dem Sync-Kontext auszuführen. Unter der Haube fügt es dem gegebenen ioloop zur Verfügung gestellte Zukunft hinzu und ruft run_forever dann Ergebnis zurück oder wirft Ausnahme (aufgelöst Zukunft).

Eigentlich müssen Sie await run_fetch(loop, 'http://google.com'), da die Anruferfunktion asynchron ist.

+0

Das macht Sinn, und hat funktioniert! Vielen Dank! – user4445586

Verwandte Themen