requests统一超时

之前出现过很多使用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

你可能感兴趣的:(requests统一超时)