2016-10-22 8 views
3

ich einen Test aiohttp Webserver ausgeführt wird:Python 3.5 aiohttp blockiert, auch wenn Asynchron mit/erwarten

#!/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') 

Dies wird voraussichtlich in der Lage sein, mehrere eingehende Anfrage zur gleichen Zeit zu behandeln, ohne eine warten, Anfrage, um vor der Verarbeitung der nächsten abzuschließen. Es ist jedoch nicht so zu tun - die Verarbeitung sequentiell ist (man beachte die Startzeit der 2./3. Antrag ist nach dem vorherigen Anfragen Fertigstellung):

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

würde ich die Startzeit für jede Anforderung erwarten fast gleich sein (je nachdem, wie schnell ich sie einreiche, hier sende ich manuell innerhalb von ein oder zwei Sekunden).

+0

Wie machen Sie die Anfragen? Nicht alle Clients erlauben gleichzeitige Anfragen an dieselbe URL. – dirn

+0

Ich mache die Anfragen, indem ich drei Registerkarten nebeneinander in Firefox öffne und sie schnell durchblättere und die Seite aktualisiere (die URL ist http: // localhost: 15000 in allen drei). –

+0

Ich glaube, dass Firefox einer der Clients ist, die keine gleichzeitigen Anfragen an dieselbe URL senden. Mit einem Tool, das besser zum Testen geeignet ist (wie in der Antwort von Andrew Swetlov) sollte Ihnen Ihr gewünschtes Verhalten zeigen. – dirn

Antwort

2

Etwas stimmt nicht mit Ihrer Testtechnik.

Das Ausführen von wrk Tool gegen Ihren Server bietet anderes Ergebnis.

Befehl auszuführen:

wrk http://127.0.0.1:15000/ 

Ausgangsserver:

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

Danke. Ich denke, es gab etwas Ungewöhnliches, wenn man Anfragen manuell über Seitenaktualisierungen in Firefox einreicht. Ich habe es mit wrk versucht und es funktioniert in der Tat gut. –

+0

Haben wir eine Ahnung, was passiert? Dasselbe Verhalten, wenn ich die Anfragen manuell über den Browser absende. – argaen

+0

Vielleicht teilt ein Browser die gleiche Verbindung zum selben URI zwischen den Tabs. Probieren Sie verschiedene Browser-Instanzen aus. –