aiohttp:从正在运行的web调用asyncio。应用程序:RuntimeError:此事件循环已在运行

时间:2017-05-05 23:54:17

标签: python rest python-asyncio event-loop aiohttp

我正在尝试从我的服务中进行API调用,而且我遇到了事件循环问题。有人能帮助我理解我做错了吗?

基本上我想制作一项服务,根据从不同服务中提取的数据进行一些计算。

我可以在cli中调用以下代码,但不是在我启动网络应用时(即)点击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行,开头     resp =来自self._request_handler(请求)的收益

文件“... / aiohttp / web.py”,第289行,在_handle中     resp =来自处理程序(请求)的收益

文件“... / sample.py”,第11行,添加数据= loop.run_until_complete(run_fetch(loop,'http://google.com'))

文件“... / python3.6 / asyncio / base_events.py”,第454行,在run_until_complete中     self.run_forever()

文件“... / python3.6 / asyncio / base_events.py”,第408行,在run_forever中     raise RuntimeError('此事件循环已在运行')

RuntimeError:此事件循环已在运行

1 个答案:

答案 0 :(得分:2)

run_until_complete是从同步上下文运行某些异步代码的方法。它增加了未来给定的ioloop并调用run_forever然后返回结果或抛出异常(已解决的未来)。

实际上你需要await run_fetch(loop, 'http://google.com'),因为调用函数是异步的。