背景
最近在搞爬虫,很多小组件里面都使用了 Python 的 requests
库,很好用,很强大。
但最近发现很多任务总是莫名其妙的卡住,不报错,但是就是不继续执行。
排查了一圈,最后把问题锁定在 requests
的 timeout
机制上。
注:本文讨论的是 Python 的第三方模块
requests
,并不是 Python 内建模块urllib
中的request
模块,请注意区分。
如何设置超时时间
requests
设置超时时间有两种方式。
一种是设置单一值作为 timeout,如下所示:
r = requests.get('https://github.com', timeout=5)
这时, timeout
值将会用作 connect
和 read
二者的共同的超时时间。
另一种是分别制定连接超时和读取超时的时间,如下所示:
r = requests.get('https://github.com', timeout=(3.05, 27))
这里前面的 3.05
表示连接超时时间,27
表示读取超时时间。
官方一般推荐大家把连接超时时间设置为比 3 的整数倍稍微大一点的时间,比如 3.05
、6.05
这样,具体原因见 这里。
坑
上面提到的两种超时时间,连接超时和读取超时,并不是都有默认超时时间。
连接超时的默认时间是 21s
,而读取超时没有默认时间,换句话说,不会超时。
也就是说,如果一个请求,连接成功了,正在读取数据,但是此时服务器出现了什么问题,或者代理出现了什么问题,那么,这个请求就会一直卡住,不会报错,也不会继续。
天长地久。
避坑
所以,为了避免出现这样的情况,给你的 requests
加上超时时间吧,尤其是请求量巨大的时候。
常在河边走,哪有不湿鞋。
参考资料
版权声明:本文为zhyl8157121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。