天天看點

Python requests timeout 分析背景如何設定逾時時間坑避坑參考資料

文章目錄

  • 背景
  • 如何設定逾時時間
  • 避坑
  • 參考資料

背景

最近在搞爬蟲,很多小元件裡面都使用了 Python 的

requests

庫,很好用,很強大。

但最近發現很多任務總是莫名其妙的卡住,不報錯,但是就是不繼續執行。

排查了一圈,最後把問題鎖定在

requests

timeout

機制上。

注:本文讨論的是 Python 的第三方子產品

requests

,并不是 Python 内模組化塊

urllib

中的

request

子產品,請注意區分。

如何設定逾時時間

requests

設定逾時時間有兩種方式。

一種是設定單一值作為 timeout,如下所示:

這時,

timeout

值将會用作

connect

read

二者的共同的逾時時間。

另一種是分别制定連接配接逾時和讀取逾時的時間,如下所示:

這裡前面的

3.05

表示連接配接逾時時間,

27

表示讀取逾時時間。

官方一般推薦大家把連接配接逾時時間設定為比 3 的整數倍稍微大一點的時間,比如

3.05

6.05

這樣,具體原因見 這裡。

上面提到的兩種逾時時間,連接配接逾時和讀取逾時,并不是都有預設逾時時間。

連接配接逾時的預設時間是

21s

,而讀取逾時沒有預設時間,換句話說,不會逾時。

也就是說,如果一個請求,連接配接成功了,正在讀取資料,但是此時伺服器出現了什麼問題,或者代理出現了什麼問題,那麼,這個請求就會一直卡住,不會報錯,也不會繼續。

天長地久。

避坑

是以,為了避免出現這樣的情況,給你的

requests

加上逾時時間吧,尤其是請求量巨大的時候。

常在河邊走,哪有不濕鞋。

參考資料

  • Requests 官方文檔