Python的requests库因接口简洁而被广泛使用,但在频繁发起HTTP请求时,若不注意用法,容易出现连接反复建立、等待阻塞等问题。通过一些配置和编码习惯的调整,可以显著提升请求性能。

使用Session复用TCP连接
每次调用requests.get都会新建一个会话并断开连接。使用requests.Session可以让多次请求复用底层TCP连接,减少握手开销。
import requests
# 使用Session保持连接
session = requests.Session()
for i in range(10):
# 复用连接,降低延迟
resp = session.get('https://ipipp.com/api/' + str(i))
print(resp.status_code)
session.close()
设置超时避免无限等待
未设置超时可能导致线程长期阻塞。建议为连接和读取分别设置超时时间。
import requests
try:
# 连接超时2秒,读取超时5秒
r = requests.get('https://ipipp.com/api/test', timeout=(2, 5))
print(r.text)
except requests.exceptions.Timeout:
print('请求超时')
使用重试机制提高稳定性
结合urllib3的Retry,可在网络波动时自动重试,减少失败率。
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503])
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
resp = session.get('https://ipipp.com/api/stable')
print(resp.status_code)
多线程并发发送请求
对于相互独立的请求,可以用线程池并发执行,缩短总耗时。
import requests
from concurrent.futures import ThreadPoolExecutor
def fetch(url):
return requests.get(url).status_code
urls = ['https://ipipp.com/api/' + str(i) for i in range(20)]
with ThreadPoolExecutor(max_workers=5) as pool:
results = list(pool.map(fetch, urls))
print(results)
其他注意事项
- 尽量使用
response.iter_content处理大文件,避免一次性读入内存 - 在调试时通过
response.elapsed查看单次请求耗时 - 若服务端支持,可开启HTTP/2或使用aiohttp做异步请求
性能优化应基于实际测量,建议先用少量请求统计耗时,再针对性调整连接数与并发策略。
小结
通过Session复用、超时控制、重试配置以及并发请求等方式,Python requests的性能可以得到明显提升。在真实项目中,应根据接口特点和机器资源灵活组合这些技巧。