aiohttp: calling asyncio from a running web.Application: RuntimeError: This event loop is already running
aiohttp: calling asyncio from a running web.Application: RuntimeError: This event loop is already running
我正在尝试从我的服务中进行 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)
异常:
错误处理请求
追溯(最近一次通话):
文件“.../aiohttp/web_protocol.py”,第 417 行,开始
resp = 从 self._request_handler(请求)
中产生
文件“.../aiohttp/web.py”,第 289 行,在 _handle 中
resp = yield from handler(request)
文件“.../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
提高 RuntimeError('This event loop is already running')
RuntimeError: 这个事件循环已经 运行
run_until_complete
是从同步上下文 运行 一些异步代码的方法。在引擎盖下,它将提供的未来添加到给定的 ioloop 并调用 run_forever
然后 returns 结果或抛出异常(已解决的未来)。
实际上你需要 await run_fetch(loop, 'http://google.com')
,因为调用函数是异步的。
我正在尝试从我的服务中进行 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)
异常:
错误处理请求 追溯(最近一次通话): 文件“.../aiohttp/web_protocol.py”,第 417 行,开始 resp = 从 self._request_handler(请求)
中产生文件“.../aiohttp/web.py”,第 289 行,在 _handle 中 resp = yield from handler(request)
文件“.../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 提高 RuntimeError('This event loop is already running')
RuntimeError: 这个事件循环已经 运行
run_until_complete
是从同步上下文 运行 一些异步代码的方法。在引擎盖下,它将提供的未来添加到给定的 ioloop 并调用 run_forever
然后 returns 结果或抛出异常(已解决的未来)。
实际上你需要 await run_fetch(loop, 'http://google.com')
,因为调用函数是异步的。