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).
Wie machen Sie die Anfragen? Nicht alle Clients erlauben gleichzeitige Anfragen an dieselbe URL. – dirn
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). –
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