【问题标题】:asyncio doesn't work on listening to the http requestasyncio 在监听 http 请求时不起作用
【发布时间】:2018-10-05 20:44:17
【问题描述】:

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

Traceback(最近一次调用最后一次):文件“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(路由)文件“/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, handler, **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 行,在 init 中 资源=资源)文件“/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.x python-asyncio aiohttp


    【解决方案1】:

    如果您查看服务器示例here

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

    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.
    

    【讨论】:

    • 在这种情况下,服务器一次处理一个请求。如果我收到 100 个请求,我希望代码能够并行获取。
    • @rickcoup 为什么你认为服务器一次只处理一个请求?答案中的await 只会暂停 current 协程,它不会影响服务于其他请求的其他协程。
    • 这是我尝试的第一件事。在完成第一个请求的所有三个功能之前,它甚至不会处理第二个请求。
    • @rickcoup 你是怎么确定的?问题中显示的代码在几个方面不正确,答案显示了如何修复它。对于额外的测试,我现在尝试运行类似的更正modified version。我还运行了nc -lp8081,以便fetch 可以连接但仍处于挂起状态。如果我与多个客户端连接,我会看到请求对象已打印,即使前一个请求未完成,这意味着请求是并行运行的。如果您正在运行更正后的代码并看到不同的内容,请编辑问题。
    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多