之前出现过很多使用requests调用外部http请求很慢的情况,导致自己的系统gunicorn worker心跳阻塞,被master进程直接杀掉。但是之前都没去若requests里通过设置timeout去设置超时。由于这边调用requests请求的情况较多,大概有上百个所以更改的话最好是设置统一超时。
查看网上不少说直接设置socket.setdefaulttimeout就可以,亲测行不通。为什么不行?
1 requests是基于urllib3的,urllib3应该未使用socket.setdefaulttimeout在最后创建socket连接的时候设置默认。
2 使用urllib2的时候用socket.setdefaulttimeout亲测ok,可以生效。
那在使用requests的情况如何统一加超时而不用一个一个去加timeout?如下:
def _patch_requests():
try:
from requests.sessions import Session
except ImportError:
return
real_send = Session.send
def send(self, request, *args, **kwargs):
if not kwargs.get('timeout'):
kwargs['timeout'] = 3
return real_send(self, request, *args, **kwargs)
Session.send = send
_patch_requests()
只需要在使用requests之前增加上边代码片段即可在后续使用requests的任何时候统一超时生效。
# 在前边增加如上代码段
data = requests.get('http://luckyboyburgers.com/')
print data.text
网友评论