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

121
我使用requests创建POST请求,如下所示,指定了timeout阈值: response = requests.post(url, data=post_fields, timeout=timeout) 然而,为了确定一个“好”的threshold,我需要对服务器的响应时间进行基准测试。
我该如何计算服务器的最小和最大响应时间?

试试使用contextmanager,你可以将其包裹在一个简单的函数中,该函数接收经过的时间,而不必编写一个全新的装饰器。 - gold_cy
2个回答

255

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


24
只想补充一点,elapsed 可以在任何 Response 上使用,不仅仅是 POST 请求的响应。 - gdvalderrama
27
请注意,这不会为您提供从服务器下载响应所需的时间,而仅仅是获取返回标头但不包括响应内容的时间。如果您想要计算下载响应所需的时间,您需要使用 time.clock() 函数来测量整个过程的耗时。 - DanyAlejandro
然而,令人失望的是,在发生错误时(包括普通的读取超时),elapsed 不可用,而在这种情况下测量执行时间是一个合理的期望。 - mirekphd
@mirekphd 我明白你的意思,但对于读取超时,永远不会收到任何响应 - undefined

29
这取决于你是否可以用大量的测试请求命中服务器,或者你是否需要等待真实请求发生。
如果你需要真实的请求数据,那么你需要包装调用来确定每个请求的时间。
start = time.perf_counter()
response = requests.post(url, data=post_fields, timeout=timeout)
request_time = time.perf_counter() - start
self.logger.info("Request completed in {0:.0f}ms".format(request_time))
#store request_time in persistent data store

你需要一个地方来存储每个请求的结果一段时间(文件、数据库等)。然后,你可以计算响应时间的统计数据。
如果你有一个可用的测试服务器,你可以使用类似apachebench的工具,在没有Python的情况下对响应进行基准测试,并为每个请求发送测试数据。

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


3
time.clock()函数已在Python 3.8中被移除。首选替代似乎是time.perf_counter() - Claus Conrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接