我正在尝试从我的服务中进行API调用,并且我遇到了事件循环问题 . 有人能帮我理解我做错了吗?
基本上我想创建一个服务,根据从不同服务中提取的数据进行一些计算 .
我可以从cli调用下面的代码,但是当我启动一个Web应用程序(即)点击http://127.0.0.1:8080/add时
loop = asyncio.get_event_loop()
data = loop.run_until_complete(run_fetch(loop, 'http://google.com'))
示例代码:
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)
例外:
错误处理请求Traceback(最近一次调用最后一次):文件“... / aiohttp / web_protocol.py”,第417行,在start resp = yield from self._request_handler(request)
文件“... / aiohttp / web.py”,第289行,在_handle resp = yield from handler(request)
文件".../sample.py",第11行,添加数据= loop.run_until_complete(run_fetch(loop,'http://google.com'))
在run_until_complete self.run_forever()中输入文件“... / python3.6 / asyncio / base_events.py”,第454行
文件“... / python3.6 / asyncio / base_events.py”,第408行,在run_forever中引发RuntimeError('此事件循环已在运行')
RuntimeError:此事件循环已在运行
1 回答
run_until_complete是从同步上下文运行某些异步代码的方法 . 它增加了未来给定的ioloop并调用
run_forever
然后返回结果或抛出异常(已解决的未来) .实际上你需要
await run_fetch(loop, 'http://google.com')
,因为调用函数是异步的 .