文章目錄
- 背景
- 如何設定逾時時間
- 坑
- 避坑
- 參考資料
背景
最近在搞爬蟲,很多小元件裡面都使用了 Python 的
requests
庫,很好用,很強大。
但最近發現很多任務總是莫名其妙的卡住,不報錯,但是就是不繼續執行。
排查了一圈,最後把問題鎖定在
requests
的
timeout
機制上。
注:本文讨論的是 Python 的第三方子產品,并不是 Python 内模組化塊
requests
中的
urllib
子產品,請注意區分。
request
如何設定逾時時間
requests
設定逾時時間有兩種方式。
一種是設定單一值作為 timeout,如下所示:
這時,
timeout
值将會用作
connect
和
read
二者的共同的逾時時間。
另一種是分别制定連接配接逾時和讀取逾時的時間,如下所示:
這裡前面的
3.05
表示連接配接逾時時間,
27
表示讀取逾時時間。
官方一般推薦大家把連接配接逾時時間設定為比 3 的整數倍稍微大一點的時間,比如
3.05
、
6.05
這樣,具體原因見 這裡。
坑
上面提到的兩種逾時時間,連接配接逾時和讀取逾時,并不是都有預設逾時時間。
連接配接逾時的預設時間是
21s
,而讀取逾時沒有預設時間,換句話說,不會逾時。
也就是說,如果一個請求,連接配接成功了,正在讀取資料,但是此時伺服器出現了什麼問題,或者代理出現了什麼問題,那麼,這個請求就會一直卡住,不會報錯,也不會繼續。
天長地久。
避坑
是以,為了避免出現這樣的情況,給你的
requests
加上逾時時間吧,尤其是請求量巨大的時候。
常在河邊走,哪有不濕鞋。
參考資料
- Requests 官方文檔