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
Das macht Sinn, und hat funktioniert! Vielen Dank! – user4445586