爬蟲多執行緒卡死或阻塞,程式無法異常終止

2021-10-08 11:48:49 字數 771 閱讀 8692

研究了一下網上資料以及自己的**,已經解決了,下面是思路

當執行緒卡死或者阻塞時,應首先考慮網路或者其他異常導致請求無法自動判定為超時,掛掉該執行緒,而是使執行緒一直處於卡死狀態

當手動加上超時時間,就可以大概率解決該異常

從某種程度上來說,我們做請求時,都應該加上超時限制,不然**卡在奇怪的地方,還要分析好久

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 隊列為空的時候,獲取元素的執行緒被阻塞,直到佇列不空。生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,...