如何测量 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 服务