Я написал прокси-сервер 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 с медленно, учитывая среднее значение), но я не уверен, коррелируют ли они и почему.