2016-10-22 18 views
3

기다리고 :이 하나 기다릴 필요없이 동시에 여러 들어오는 요청을 처리 할 수있을 것으로 기대된다파이썬 3.5 aiohttp 블록도/나는 시험 aiohttp 웹 서버를 실행하는거야

#!/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 요청은 이전 요청이 완료된 후입니다) :

======== 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 

나는 (각 요청의 시작 시간은 거의 동일 기대 내가 그들을 제출하는 방법에 따라, 여기에서 나는 수동으로 1 ~ 2 초 내에 제출할 것입니다.)

+0

는 어떻게 요청하고 있습니다를? 모든 클라이언트가 동일한 URL에 동시에 요청할 수있는 것은 아닙니다. – dirn

+0

Firefox에서 세 개의 탭을 나란히 열고 요청을 빠르게 만들고 페이지를 새로 고칩니다 (URL은 http : // localhost : 15000 모두 3 개). –

+0

파이어 폭스는 동일한 URL에 동시 요청을하지 않는 클라이언트 중 하나라고 생각합니다. @Andrew Svetlov의 대답과 같이 테스트에 더 적합한 도구를 사용하면 원하는 동작을 나타내야합니다. – dirn

답변

2

테스트 기술에 문제가 있습니다.

서버에 대해 wrk 도구를 실행하면 다른 결과가 나타납니다.

명령 실행 :

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 
+0

감사합니다. 파이어 폭스의 페이지 새로 고침을 통해 수동으로 요청을 제출하면 펑키 한 일이 발생했다고 생각합니다. 난 wrk를 사용하여 시도하고 실제로 잘 작동합니다. –

+0

우리는 어떤 일이 일어날 지 아무 단서가 있습니까? 브라우저를 사용하여 수동으로 요청을 제출하는 경우에도 동일한 동작이 발생합니다. – argaen

+0

아마도 브라우저는 탭 사이의 동일한 URI에 동일한 연결을 공유합니다. 다른 브라우저 인스턴스를 사용해보십시오. –

관련 문제