为什么某些相同的POST请求所花的时间比其他请求长两倍或三倍?

时间:2018-12-02 09:52:25

标签: python python-requests python-multithreading

我想发送数十个POST请求,每个请求之间相隔50毫秒。所有请求都相同。它们大约需要315毫秒(发送时间+延迟),但是由于一个原因,我忽略了四个请求(平均)要花两到三倍的时间(请参阅下面的Charles Proxy时间轴图表)。

有人可以向我解释为什么吗?是因为多线程的实现不正确(请参见下面的代码)?

import thread
import time
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

url = XXX
req_data = XXX

session = requests.Session()
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
session.cookies.clear()

def send_request(url, data):
    r = session.post(url, verify=False, data=data)

for i in range(20):
    time.sleep(0.050)
    thread.start_new_thread( send_request, (url, req_data,) )

Charles Request Timeline

来自Charles文档的传说:

  

图表上的每个条形图均分为三个部分:

     
      
  • 请求-发送(上传)请求(深蓝色)所花费的时间
  •   
  • 延迟-等待网络延迟或服务器上的处理时间所花费的时间(蓝色)
  •   
  • 响应-接收(下载)响应(浅蓝色)所花费的时间
  •   

编辑:

我分析了通过Wireshark进行的连接,以下是〜300ms请求和〜800ms请求的示例。

似乎800ms比300ms多两个ACK数据包。任何人都知道这两个请求之间发生了什么以及有什么不同?

300毫秒请求 300ms

800毫秒请求 800ms

1 个答案:

答案 0 :(得分:1)

使用Wireshark进行的数据包分析(请参阅主帖子中的编辑)显示,两个查询(一个很长的查询)之间的500ms间隔来自SSL密钥交换时的ACK数据包。

提醒一下,我所有的请求都通过代理Charles Web Proxy。

经过一些测试,似乎问题出在与Charles进行SSL验证(有时会增加500ms的请求上传时间)。

在以下情况下,查询具有相等的发送时间和常规的发送时间:

  • 当我不使用Charles Proxy时
  • 当我使用代理Charles时,我通过“ http”而不是 “ https”(没有SSL)这是我保留的解决方案,因为没有敏感 数据)。

感谢您的帮助:)

此答案显示了Charles Web Proxy的SSL认证与该问题之间的联系,但并没有对此进行详尽解释

相关问题