即使使用异步/等待,Python 3.5 aiohttp也会阻塞 [英] Python 3.5 aiohttp blocks even when using async/await

查看:128
本文介绍了即使使用异步/等待,Python 3.5 aiohttp也会阻塞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行测试aiohttp Web服务器:

I'm running a test aiohttp webserver:

#!/usr/bin/env python3

from aiohttp import web
import time
import asyncio
import random
import string
import logging

logger = logging.getLogger('webserver')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

def randomword(length):
    return ''.join(random.choice(string.ascii_lowercase) for i in range(length))

async def hello(request):
    sleeptime = 10 # seconds

    requestid = randomword(5)
    logger.info("Request id: {} received - will sleep for {}".format(requestid, sleeptime))

    await asyncio.sleep(sleeptime)

    logger.info("Request id: {} wakeup and respond".format(requestid))
    return web.json_response()

# create app and register with request handler
app = web.Application()
app.router.add_get('/', hello)
web.run_app(app, port='15000')

这有望在以下位置处理多个传入请求无需等待一个请求完成就可以处理下一个请求。但是,它不是这样做的-处理是顺序的(请注意,第2个/第3个请求的开始时间在上一个请求完成之后):

This is expected to be able to handle multiple incoming request at the same time without having to wait for one request to complete before processing the next one. However, it is not doing so - the processing is sequential (note the start time of 2nd/3rd request is after the previous requests completion):

======== Running on http://0.0.0.0:15000/ ========
(Press CTRL+C to quit)
2016-10-23 02:28:23,911 - webserver - INFO - Request id: hpzdo received - will sleep for 10
2016-10-23 02:28:33,922 - webserver - INFO - Request id: hpzdo wakeup and respond
2016-10-23 02:28:33,947 - webserver - INFO - Request id: pdfbs received - will sleep for 10
2016-10-23 02:28:43,957 - webserver - INFO - Request id: pdfbs wakeup and respond
2016-10-23 02:28:43,971 - webserver - INFO - Request id: dmkav received - will sleep for 10
2016-10-23 02:28:53,982 - webserver - INFO - Request id: dmkav wakeup and respond

我希望每个请求的开始时间几乎相同(取决于我提交它们的速度;这里我在一两秒钟之内手动提交)。

I would expect the start time for each request be almost same (depending on how fast I'm submitting them; here I'm submitting manually within a second or two).

推荐答案

您的测试技术有问题。

运行 wrk 工具针对您的服务器提供了不同的结果。

Running wrk tool against your server provides different result.

运行命令:

wrk http://127.0.0.1:15000/  

服务器输出:

======== Running on http://0.0.0.0:15000 ========
(Press CTRL+C to quit)
2016-10-23 14:58:56,447 - webserver - INFO - Request id: hkkrp received - will sleep for 10
2016-10-23 14:58:56,447 - webserver - INFO - Request id: cysoy received - will sleep for 10
2016-10-23 14:58:56,448 - webserver - INFO - Request id: udwxe received - will sleep for 10
2016-10-23 14:58:56,448 - webserver - INFO - Request id: moqkf received - will sleep for 10
2016-10-23 14:58:56,449 - webserver - INFO - Request id: shetp received - will sleep for 10
2016-10-23 14:58:56,450 - webserver - INFO - Request id: fhilc received - will sleep for 10
2016-10-23 14:58:56,451 - webserver - INFO - Request id: birax received - will sleep for 10
2016-10-23 14:58:56,452 - webserver - INFO - Request id: yyeoc received - will sleep for 10
2016-10-23 14:58:56,453 - webserver - INFO - Request id: mpkwf received - will sleep for 10
2016-10-23 14:58:56,454 - webserver - INFO - Request id: nkxiz received - will sleep for 10
2016-10-23 14:59:06,450 - webserver - INFO - Request id: hkkrp wakeup and respond
2016-10-23 14:59:06,451 - webserver - INFO - Request id: cysoy wakeup and respond
2016-10-23 14:59:06,451 - webserver - INFO - Request id: udwxe wakeup and respond
2016-10-23 14:59:06,452 - webserver - INFO - Request id: moqkf wakeup and respond
2016-10-23 14:59:06,452 - webserver - INFO - Request id: shetp wakeup and respond
2016-10-23 14:59:06,453 - webserver - INFO - Request id: fmpmm received - will sleep for 10
2016-10-23 14:59:06,453 - webserver - INFO - Request id: uusnt received - will sleep for 10
2016-10-23 14:59:06,453 - webserver - INFO - Request id: kjlzk received - will sleep for 10
2016-10-23 14:59:06,453 - webserver - INFO - Request id: elhje received - will sleep for 10
2016-10-23 14:59:06,453 - webserver - INFO - Request id: bkvjp received - will sleep for 10
2016-10-23 14:59:06,454 - webserver - INFO - Request id: fhilc wakeup and respond
2016-10-23 14:59:06,454 - webserver - INFO - Request id: birax wakeup and respond
2016-10-23 14:59:06,454 - webserver - INFO - Request id: yyeoc wakeup and respond
2016-10-23 14:59:06,455 - webserver - INFO - Request id: nyhba received - will sleep for 10
2016-10-23 14:59:06,455 - webserver - INFO - Request id: iqjvr received - will sleep for 10
2016-10-23 14:59:06,455 - webserver - INFO - Request id: osfsg received - will sleep for 10
2016-10-23 14:59:06,455 - webserver - INFO - Request id: mpkwf wakeup and respond
2016-10-23 14:59:06,456 - webserver - INFO - Request id: nkxiz wakeup and respond
2016-10-23 14:59:06,456 - webserver - INFO - Request id: ebzai received - will sleep for 10
2016-10-23 14:59:06,456 - webserver - INFO - Request id: erfhe received - will sleep for 10

这篇关于即使使用异步/等待,Python 3.5 aiohttp也会阻塞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆