2016-10-22 40 views
3

を用いた場合であっても、私は、テストaiohttpウェブサーバを実行している:のPython 3.5 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') 

これは、同時に複数の着信要求を処理できるように期待されている1を待つことなく、次のものを処理する前に完了を要求する。しかし、それはそうされていません - 処理がシーケンシャルである(第二の開始時間に注意してください/第三の要求は、前の要求が完了した後で):

======== 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で3つのタブを並べて表示し、それらをすばやく循環させ、ページを更新することでリクエストを作成しています(URLはhttp:// localhost:15000です)。 –

+0

私は、Firefoxが同じ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

ありがとうございます。私はFirefoxでページの更新を介して手動でリクエストを送信することで何か不思議なことが起こったと思います。私はwrkを使ってみましたが、実際にうまくいきます。 –

+0

何が起こるかの手掛かりはありますか?私はブラウザを使用して手動でリクエストを提出する場合、同じ動作を持っています。 – argaen

+0

ブラウザがタブ間の同じURIに同じ接続を共有している可能性があります。 異なるブラウザインスタンスを試してみてください。 –

関連する問題