之前寫了乙個多執行緒爬取桌布程式後,發現有時候執行起來,會有執行緒在開啟某張的鏈結時卡住(似乎一般是在比較大的時候),報錯也不報,許久都不能恢復。。
可以設定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 方案二 進入...