首页 > 解决方案 > asyncio 在监听 http 请求时不起作用

问题描述

aiohttp作为我的服务器运行。当一个请求进来时,我会尝试生成一个进程来处理它。但我收到以下错误:

回溯(最后一次调用):文件“asyncppx.py”,第 33 行,在 app.add_routes([web.get('/', asyncio.ensure_future(runMcows(n)))]) 文件“/Users/i3ye /Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_app.py”,第 231 行,在 add_routes self.router.add_routes(routes) 文件“/Users/i3ye/Programming/vsc/ async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py”,第 966 行,在 add_routes route_obj.register(self) 文件“/Users/i3ye/Programming/vsc/async/env/lib/python3 .6/site-packages/aiohttp/web_routedef.py”,第 38 行,寄存器 reg(self.path, self.handler, **self.kwargs) 文件“/Users/i3ye/Programming/vsc/async/env/ lib/python3.6/site-packages/aiohttp/web_urldispatcher.py”,第 922 行,在 add_get resource.add_route(hdrs.METH_HEAD,处理程序,**kwargs)文件“/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py”,第 269 行,在 add_route expect_handler=expect_handler)文件“/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py”,第 682 行,在初始化 资源 = 资源)文件“/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py”,第 103 行,在init 断言可调用(处理程序),处理程序 AssertionError : > 任务被破坏,但它正在等待处理!任务:> sys:1:RuntimeWarning:从未等待协程“runMcows”

代码如下,有什么建议吗?

from aiohttp import web
import aiohttp
import asyncio

loop = asyncio.get_event_loop()

#tasks = []
n = 0

def mcowA(n):
   print (n, " : A") 
   return

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

def mcowB(n):
   print (n, " : B") 
   return

async def runMcows(n):
    mcowA(n)
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://localhost:8081')
    mcowB(n)
    return html


try:
    app = web.Application()
    app.add_routes([web.get('/', asyncio.ensure_future(runMcows(n)))])
    loop.run_forever()
    web.run_app(app)
finally:
    loop.close()

标签: python-3.xpython-asyncioaiohttp

解决方案


如果您在此处查看服务器示例:

您的代码在主执行中应该是这样的:

app = web.Application()
app.add_routes([web.get('/', runMcows])
web.run_app(app)

app.add_routes您需要传递一个runMcows只能接受 1 个变量的协程,即请求本身。

async def runMcows(request):
    mcowA(n)
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://localhost:8081')
    mcowB(n)
    return web.Response(text=html)  # Change this response type based on what you need.

推荐阅读