#python #python-3.x #async-await #python-asyncio #aiohttp
#python #python-3.x #async-await #python-asyncio #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. Как вы делаете запросы? Не все клиенты разрешают одновременные запросы к одному и тому же URL.
2. Я выполняю запросы, открывая три вкладки рядом в Firefox, быстро просматривая их и обновляя страницу (URL-адрес — localhost: 15000 во всех трех).
3. Я считаю, что Firefox является одним из клиентов, который не будет выполнять одновременные запросы к одному и тому же URL. Использование инструмента, лучше подходящего для тестирования (например, в ответе @Andrew Svetlov), должно показать вам желаемое поведение.
4. @dirn действительно — я использовал curl / wrk, и теперь поведение соответствует ожидаемому. Мог бы сэкономить массу времени, если бы я знал об этом поведении Firefox
Ответ №1:
Что-то не так с вашей техникой тестирования.
Запуск инструмента 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
Комментарии:
1. Спасибо. Я думаю, что с ручной отправкой запросов через обновления страницы в Firefox происходило что-то странное. Я пробовал использовать wrk, и действительно, он работает нормально.
2. Имеем ли мы какое-либо представление о том, что происходит? Такое же поведение, если я отправляю запросы вручную с помощью браузера.
3. Возможно, браузер использует одно и то же соединение с одним и тем же URI между вкладками. Попробуйте разные экземпляры браузера.