引言

本篇文章分享一下如何获取 Requests 请求的响应时间。

获取响应时间

说到获取响应时间,大家首先会想到计时,可能会写出以下代码:

import time
from contextlib import contextmanager

import requests


@contextmanager
def timer():
    t = time.time()
    yield
    print(f'运行时间为:{time.time() - t:.4f}s')


with timer() as t:
    r = requests.get("http://www.python.org")
    print(r.status_code)

虽然说也能很方便的获取到响应时间,但是还是要写额外的代码,其实 Requests 本身自带了计时器,每个请求都会记录请求的响应时间,话不多说,直接上代码,响应对象中,有一个 elapsed 属性,可以直接输出它来获取响应时间。

import requests

r = requests.get("http://www.python.org")
print(r.status_code)
print(r.elapsed)
print(r.elapsed.total_seconds())
print(r.elapsed.seconds)
print(r.elapsed.microseconds)
print(r.elapsed.days)

运行结果:

200
0:00:00.684367
0.684367
0
684367
0

elapsed 属性是一个 datetime.timedelta 类型的值,可以转换成秒,微妙,天等类型的时间类型。

获取响应时间源码

从源码看,响应对象中,有一个 elapsed 属性,在构造函数中初始化成了 datetime.timedelta(0)

image-20241205214923771

requests.adapters.BaseAdapter.send 方法中,在发送请求之前启用了计时器,在收到响应之后,停止计时器,将时间的差值赋值给 elapsed 属性,从而获取当前响应的响应时间。image-20241205215254056

总结

在本篇文章中,我们了解了如何在使用 Requests 时获取响应时间。除了自己编写计时器外,利用 Requests 自带的 elapsed 属性可以更加方便和直观地完成这一任务。此外,通过对源码的简单分析,我们也理解了 elapsed 属性的实现原理,这不仅有助于我们高效地使用 Requests,还能加深对其内部机制的认识。

希望本文能够帮助大家在日常开发中更好地掌握和运用 Requests。


LLLibra146
35 声望6 粉丝

会修电脑的程序员