研究了一下網上資料以及自己的**,已經解決了,下面是思路
當執行緒卡死或者阻塞時,應首先考慮網路或者其他異常導致請求無法自動判定為超時,掛掉該執行緒,而是使執行緒一直處於卡死狀態
當手動加上超時時間,就可以大概率解決該異常
從某種程度上來說,我們做請求時,都應該加上超時限制,不然**卡在奇怪的地方,還要分析好久
def down(ts_queue, headers):tt_name = threading.current_thread().getname()
while true:
if ts_queue.empty():
break
url = ts_queue.get()
filename = re.search('([a-za-z0-9-_]+.ts)', url).group(1).strip()
try:
requests.packages.urllib3.disable_warnings()
r = requests.get(url, stream=true, headers=headers, verify=false, timeout=5)
with open('cache/' + filename, 'wb') as fp:
for chunk in r.iter_content(5424):
if chunk:
fp.write(chunk)
except exception as e:
ts_queue.put(url)
多執行緒與協程爬蟲
網路爬蟲是一種高io密集型任務,所以傳統的程序或者多程序並不適合網路爬蟲。雖然由於cpython中全域性直譯器鎖gil的存在,無法真正意義上的實現多執行緒,但這種 不完美的多執行緒 依然可以大大提高爬蟲效率,當然在提高爬蟲效率方面還有大家所熟知的協程。比較官方的介紹我就不說了,畢竟瞅了一眼一大串,這...
多執行緒 阻塞佇列
blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time,unit 檢查element peek...
多執行緒 阻塞佇列
1 當佇列滿的時候,插入元素的執行緒被阻塞,直達佇列不滿。2 隊列為空的時候,獲取元素的執行緒被阻塞,直到佇列不空。生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,...