grequest не всегда быстро отправляет запрос

Я написал прокси-сервер TCP в python 2.7, который создает гринлет для каждого соединения с помощью gevent. Когда сокет закрывается, я закрываю гринлет. Я использую grequest.map для POST данных, получаемых данным соединением. Я использую grequests, потому что хочу, чтобы гринлет уступал, пока он ожидает ответа HTTP на POST.

Когда я тестирую сервер, работающий локально только с одним подключением, иногда проходит до 0,5 секунды с момента, когда я сопоставляю grequest, до того, как urllib3 регистрирует, что он запускает соединение. Он непостоянен, в основном делает запрос в течение 0,05 с, но иногда намного дольше.

Я регистрирую время, которое требуется, когда я говорю grequests сделать запрос, а также прошедшее время, о котором сообщают запросы. Кроме того, я ставлю временные метки во все свои журналы, поэтому я вижу в журналах, что иногда существует большой временной разрыв.

Вот как код выглядит на сервере:

req = grequests.post(endpoint, data=json.dumps(body), headers=headers, timeout=1)
a = time.time()
socket_log_debug(address, context, "Starting post...")
grequests.map([req])
b = time.time()
socket_log_info(address, context, "Time1: {}".format(b-a))
socket_log_info(address, context, "Time2: {}".format(req.response.elapsed.total_seconds()))

А это пример получившегося лога, когда постить долго:

tcp-app: 17-04-04 12:24:38.432 root DEBUG: connection=49416, serialnum=TST-000, message='Starting post...'
tcp-app: 17-04-04 12:24:38.843 requests.packages.urllib3.connectionpool DEBUG: Starting new HTTPS connection (1): xxxxxxxxxxxxxxx
tcp-app: 17-04-04 12:24:39.509 requests.packages.urllib3.connectionpool DEBUG: xxxxxxxxxxxxxxx "POST /xx HTTP/1.1" 200 0
tcp-app: 17-04-04 12:24:39.510 root INFO: connection=49416, serialnum=TST-000, message='Time1: 1.0784201622'
tcp-app: 17-04-04 12:24:39.510 root INFO: connection=49416, serialnum=TST-000, message='Time2: 0.669282'

Почему запрос иногда так долго отправляется? Похоже, что это происходит, когда конечная точка также медленно реагирует (0,6 с медленно, учитывая среднее значение), но я не уверен, коррелируют ли они и почему.


person oregano    schedule 04.04.2017    source источник
comment
Я не уверен, но разве исправление обезьяны не предназначено для этого? Я имею в виду, зачем вам еще одна библиотека? Извините, если я что-то не так понял. Но если я прав, то у вас должна быть хорошая информация здесь - stackoverflow.com/questions/9501663/   -  person SRC    schedule 04.04.2017
comment
grequests использует исправление обезьяны; это действительно рекомендуется в теме, на которую вы ссылаетесь. Насколько я могу судить, это просто хорошо протестированная и хорошо используемая асинхронная оболочка для запросов. Я провел этот же тест без grequests (обезьяна исправил его сам) и получил тот же результат.   -  person oregano    schedule 04.04.2017
comment
Обычно первый запрос выполняется медленнее?   -  person brennan    schedule 05.04.2017