我在python 2.7中编写了一个TCP代理服务器,它使用gevent为每个连接创建一个greenlet。当插座关闭时,我关闭了greenlet。我正在使用grequest.map POST给定连接收到的数据。我正在使用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.6s在平均值下很慢)但我不确定这些是否或为何相关。