如何测量 Python 请求 POST 请求的服务器响应时间

Posted

技术标签:

【中文标题】如何测量 Python 请求 POST 请求的服务器响应时间【英文标题】:How to measure server response time for Python requests POST-request 【发布时间】:2017-09-01 07:52:52 【问题描述】:

我像这样创建requests POST 请求,我在其中指定超时阈值:

response = requests.post(url, data=post_fields, timeout=timeout)

但是,为了确定一个“好的”阈值,我想提前对服务器响应时间进行基准测试。

如何计算服务器的最小和最大响应时间?

【问题讨论】:

查看contextmanager,您可以将其包装在一个简单的函数中,该函数需要花费时间,而不必编写一个全新的装饰器 【参考方案1】:

requests.post()(和requests.get() 等)返回的Response 对象有一个名为elapsed 的属性,它提供了发送Request 和接收Response 之间的时间差。要以秒为单位获取增量,请使用total_seconds() 方法:

response = requests.post(url, data=post_fields, timeout=timeout)
print(response.elapsed.total_seconds())

注意requests.post() 是一个同步操作,这意味着它阻塞直到收到Response

【讨论】:

只想添加elapsed 可用于任何Response,而不仅仅是来自POST 请求的响应。 请注意,这不会为您提供从服务器下载响应所需的时间,而只会为您获得没有响应内容的返回标头所需的时间。如果您希望经过的时间包括下载响应所需的时间,则必须使用 time.clock() 但是,令人失望的是,当发生错误(包括普通的读取超时)时,elapsed 不可用,此时测量执行时间的能力是合理的预期。【参考方案2】:

这取决于您是否可以通过大量测试请求访问服务器,或者您是否需要等待真正的请求发生。

如果您需要真实的请求数据,那么您需要包装调用以确定每个请求的时间:

start = time.clock()
response = requests.post(url, data=post_fields, timeout=timeout)
request_time = time.clock() - start
self.logger.info("Request completed in 0:.0fms".format(request_time)
#store request_time in persistent data store

您需要在某个地方存储一段时间内每个请求的结果(文件、数据库等)。然后你可以计算响应时间的统计数据。

如果您有可用的测试服务器,您可以在不使用 python 的情况下使用 apachebench 之类的工具对响应进行基准测试,并为每个请求发送测试数据:

https://gist.github.com/kelvinn/6a1c51b8976acf25bd78

【讨论】:

以上是关于如何测量 Python 请求 POST 请求的服务器响应时间的主要内容,如果未能解决你的问题,请参考以下文章

如何通过发送带有 application/octet-stream 内容类型的“POST”请求使用 python 将视频上传到 Microsoft 服务

由于 python 中的 Post 请求,检索 get 请求的数据

如何用php向服务器发送post请求

从 POST 请求将文件保存到 Web 服务器

如何向php服务器发送数据为json的post请求

http请求头大数据post如何判断完整