Python異步爬蟲多線程與線程池示例詳解
背景
當(dāng)對(duì)多個(gè)url發(fā)送請(qǐng)求時(shí),只有請(qǐng)求完第一個(gè)url才會(huì)接著請(qǐng)求第二個(gè)url(requests是一個(gè)阻塞的操作),存在等待的時(shí)間,這樣效率是很低的。那我們能不能在發(fā)送請(qǐng)求等待的時(shí)候,為其單獨(dú)開啟進(jìn)程或者線程,繼續(xù)請(qǐng)求下一個(gè)url,執(zhí)行并行請(qǐng)求
異步爬蟲方式
多線程,多進(jìn)程(不建議)
好處:可以為相關(guān)阻塞的操作單獨(dú)開啟線程或者進(jìn)程,阻塞操作就可以異步會(huì)執(zhí)行
弊端:不能無限制開啟多線程或者多進(jìn)程(需要頻繁的創(chuàng)建或者銷毀進(jìn)程,線程)
線程池,進(jìn)程池(適當(dāng)使用)
好處:可以降低系統(tǒng)對(duì)進(jìn)程或線程創(chuàng)建和銷毀的頻率,從而很好的而降低系統(tǒng)的開銷
弊端:線程或進(jìn)程池中的數(shù)量是有上限的
單線程+異步協(xié)程(推薦)
多線程
正常運(yùn)行如下的代碼,需要花費(fèi)8秒鐘的時(shí)間,因?yàn)閟leep是一個(gè)阻塞的操作,在等待的時(shí)候不會(huì)執(zhí)行別的操作,極大地降低了效率
from time import sleep import time start = time.time() def xx(str): print('正在下載:', str) sleep(2) str = ['xiaozi', 'aa', 'bb', 'cc'] for i in str: xx(i) end = time.time() print('程序運(yùn)行時(shí)間:',end-start)
使用多線程后
from threading import Thread from time import sleep import time start = time.time() def xx(str): print('正在下載:',str) sleep(2) str = ['xiaozi','aa','bb','cc'] def main(): for s in str: #開啟線程,target=函數(shù)名,args=(xx,) ,xx為向函數(shù)傳遞的參數(shù),必須為元組類型,所以后面需要加, t = Thread(target=xx,args=(s,)) t.start() if __name__ == '__main__': main() end = time.time() print('程序運(yùn)行時(shí)間:',end-start)
但是我們發(fā)現(xiàn)下面的運(yùn)行順序貌似有點(diǎn)亂的
線程池
對(duì)上面的改為線程池后運(yùn)行
#倒入線程池模塊對(duì)應(yīng)的類 from multiprocessing.dummy import Pool from time import sleep import time start = time.time() def xx(str): print('正在下載:',str) sleep(2) str = ['xiaozi','aa','bb','cc'] #實(shí)例化一個(gè)線程池對(duì)象,線程池中開辟四個(gè)線程對(duì)象,并行4個(gè)線程處理四個(gè)阻塞操作 pool = Pool(4) #將列表中的每一個(gè)列表元素(可迭代對(duì)象)傳遞給xx函數(shù)(發(fā)生阻塞的操作)進(jìn)行處理 #map方法會(huì)有一個(gè)返回值為函數(shù)的返回值(一個(gè)列表),但是這里沒有返回值所以不考慮 #調(diào)用map方法 pool.map(xx,str) end = time.time() print('程序運(yùn)行時(shí)間:',end-start)
以上就是Python異步爬蟲多線程與線程池示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python異步多線程與線程池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中字符串比較使用is、==和cmp()總結(jié)
在Python中比較字符串最好是使用簡(jiǎn)單邏輯操作符,今天為大家講解一下is、==和cmp()使用總結(jié)2018-03-03Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明
這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對(duì)你有一定的幫助2022-02-02Python中聲明只包含一個(gè)元素的元組數(shù)據(jù)方法
這篇文章主要介紹了Python中聲明只包含一個(gè)元素的元組數(shù)據(jù)方法,本文是實(shí)際經(jīng)驗(yàn)總結(jié)而來,沒有碰到這個(gè)需要可能不會(huì)注意到這個(gè)問題,需要的朋友可以參考下2014-08-08python爬蟲學(xué)習(xí)筆記--BeautifulSoup4庫(kù)的使用詳解
這篇文章主要介紹了Python中使用Beautiful Soup庫(kù)的超詳細(xì)教程,示例代碼基于Python2.x版本,極力推薦!需要的朋友可以參考下2021-08-08python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示的代碼
這篇文章主要介紹了python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-04-04Python中的枚舉函數(shù)enumerate()的具體用法
本文主要介紹了Python中的枚舉函數(shù)enumerate()的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06