Requests遇到卡死問題的解決辦法

2022-09-23 17:06:15 字數 1222 閱讀 5266

之前寫了乙個多執行緒爬取桌布程式後,發現有時候執行起來,會有執行緒在開啟某張的鏈結時卡住(似乎一般是在比較大的時候),報錯也不報,許久都不能恢復。。

可以設定timeout引數來防止requests時間過長,並捕捉錯誤資訊然後讓再讓其requests多幾次:

try:

downloadpic(urlnum, self.threadid)

except exception as e:

print('thread %d:\ttry to request again #1' %(self.threadid))

# 請求超時,再試幾次

requestok = false # 標記

exceptionms = str(e) # 先儲存錯誤資訊

for i in range(2):

try:

downloadpic(urlnum, self.threadid)

requestok = true

break

except exception as e:

print('thread %d:\ttry to request again #%d' %(self.threadid, (i+2)))

# 請求三次還是不成功

if not requestok:

downloadfail.append(picnames[urlnum]) # 記錄**失敗的

print('thread %d:\t%s' %(self.threadid, exceptionms)) # 輸出錯誤資訊但事實上,即使設定了timeout,執行緒仍有卡死的可能。

網上的一種做法是使用socket.setdefaulttimeout(seconds)來解決,但親測並無卵用。

深究timeout的失效原因,發現是因為requests請求上設定的timeout判斷的並不是整個請求的總時間,而是從與伺服器連線成功後,客戶端開始接受伺服器的資料為計算起點的。

也就是說,若是requests請求停在了與伺服器成功連線之前的步驟,那此時無論停了多久,都不會開始計算停留時間,所以永遠都觸發不到timeout。

那麼與伺服器連線前究竟是卡在了**呢?據網上說是卡在了dns解析。

於是,我把dns更改為阿里公共dns(223.5.5.5 / 223.6.6.6)。

之後到目前是沒再出現requests卡死的情況了!

所以總結一下:

一定要設定timeout,並使用可靠的dns伺服器位址。

hive卡死問題(進入服務卡死)

最近安裝了一套測試系統,在測試系統的時候,發現有服務正常,但無法進入hive的後台介面。不管是輸入hive 還是具體的hive e 語句執行,都有相應的問題。最後問題定位為相應元件問題。查詢 tmp user hive.log 日誌,發現tez引擎沒有響應,後台通過yarn檢視到任務沒有進入執行狀態...

MySQL 卡死的問題

1.執行show full processlist觀察state和info兩列,檢視有哪些執行緒在執行。2.使用kill命令 對應執行緒前面id殺死卡死的執行緒。其他的方式 查詢是否鎖表 show open tables 查詢程序 show processlist 查詢到相對應的程序,然後殺死程序 ...

eclipse啟動卡死的問題

關於 eclipse啟動卡死的問題 eclipse上一次沒有正確關閉,導致啟動的時候卡死錯誤解決方法 自己常用的解決方法 方案一 推薦使用,如果沒有這個檔案,就使用方案二 到 metadata plugins org.eclipse.core.resources目錄,刪除檔案 snap 方案二 進入...