Питон 3.6. блокировка ввода-вывода. Сервер не принимает никаких запросов, пока обрабатывается первый запрос

Проблема в том, что сервер не принимает никаких запросов до тех пор, пока первый заданный запрос не вернется.

import asyncio
import datetime as dt
from aiohttp import web


async def search(request):
    print('!START! %s' % dt.datetime.now())

    await asyncio.sleep(5)

    print('!--END! %s' % dt.datetime.now())
    return web.json_response(data={})


app = web.Application()
app.router.add_get('/search/', search)

web.run_app(app)


#run_server
#python -m aiohttp.web -H localhost -P 8080 handler:init_func

Пример: я запустил http://localhost:8080/search/ на двух вкладках почти одновременно. время. Но я видел, что запросы обрабатываются последовательно.

!START! 2017-04-24 12:05:37.978347
!--END! 2017-04-24 12:05:47.980859
!START! 2017-04-24 12:05:48.037671
!--END! 2017-04-24 12:05:58.040659

Но я ожидал, что запросы будут обрабатываться параллельно.

!START! 2017-04-24 12:05:37.978347
!START! 2017-04-24 12:05:38.000000
!--END! 2017-04-24 12:05:47.980859
!--END! 2017-04-24 12:05:48.000000

Что я сделал не так?


person Roman    schedule 23.04.2017    source источник
comment
как вы вызываете функцию search(request)? предоставьте минимальный, полный и поддающийся проверке пример.   -  person hiro protagonist    schedule 23.04.2017
comment
для @hiroprotagonist from views import search app = web.Application() app.router.add_get('/search/', search) routes.setup(app)   -  person Roman    schedule 23.04.2017
comment
Можете ли вы объяснить больше о вашей проблеме? Что вы имеете в виду, пока первый запрос не вернется?   -  person Yuval Pruss    schedule 23.04.2017
comment
Не могу воспроизвести. Ваш пример работает, как и ожидалось (пара раз работает curl http://localhost:8080/search/ &).   -  person kwarunek    schedule 24.04.2017
comment
Действительно, он работает с curl как с параллельным. Благодарю вас! Но я запускал в FireFox и у меня последовательно. Почему браузер работает последовательно? @kwarunek   -  person Roman    schedule 24.04.2017
comment
Вероятно, какое-то дросселирование, я знаю о некотором лимите одновременных запросов на домен, но я думал, что он выше (десятки запросов). Возможно, неактивная вкладка имеет более низкий приоритет...   -  person kwarunek    schedule 24.04.2017
comment
Благодарю вас! Я пробовал 2 запроса с разными параметрами GET и получил нужный результат. localhost:8080/search/?a=1 localhost:8080/search/?a=2 @kwarunek   -  person Roman    schedule 24.04.2017


Ответы (1)


Большинство браузеров внутренне используют пул соединений и не создают новое соединение с тем же хостом. Таким образом, две страницы используют один и тот же открытый сокет.

person Andrew Svetlov    schedule 21.05.2017