我在 python 2.7 中编写了一个 TCP 代理服务器,它使用 gevent 为每个连接创建一个 greenlet。当套接字关闭时,我关闭了greenlet。我正在使用grequest.map来发布给定连接接收到的数据。我正在使用 grequests,因为我希望 greenlet 在等待对 POST 的 HTTP 响应时产生。
当我测试仅使用单个连接在本地运行的服务器时,有时从映射 grequest 到 urllib3 记录它正在启动连接需要 0.5 秒。并不一致,大多是在 0.05s 内发出请求,但偶尔会更长。
我正在记录从我告诉 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 秒很慢)时,似乎会发生这种情况,但我不确定这些是否相关或为什么相关。