Python異步爬蟲多線程與線程池示例詳解
背景
當(dāng)對多個(gè)url發(fā)送請求時(shí),只有請求完第一個(gè)url才會接著請求第二個(gè)url(requests是一個(gè)阻塞的操作),存在等待的時(shí)間,這樣效率是很低的。那我們能不能在發(fā)送請求等待的時(shí)候,為其單獨(dú)開啟進(jìn)程或者線程,繼續(xù)請求下一個(gè)url,執(zhí)行并行請求
異步爬蟲方式
多線程,多進(jìn)程(不建議)
好處:可以為相關(guān)阻塞的操作單獨(dú)開啟線程或者進(jìn)程,阻塞操作就可以異步會執(zhí)行
弊端:不能無限制開啟多線程或者多進(jìn)程(需要頻繁的創(chuàng)建或者銷毀進(jìn)程,線程)
線程池,進(jìn)程池(適當(dāng)使用)
好處:可以降低系統(tǒng)對進(jìn)程或線程創(chuàng)建和銷毀的頻率,從而很好的而降低系統(tǒng)的開銷
弊端:線程或進(jìn)程池中的數(shù)量是有上限的
單線程+異步協(xié)程(推薦)
多線程
正常運(yùn)行如下的代碼,需要花費(fèi)8秒鐘的時(shí)間,因?yàn)閟leep是一個(gè)阻塞的操作,在等待的時(shí)候不會執(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)亂的

線程池
對上面的改為線程池后運(yùn)行
#倒入線程池模塊對應(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è)線程池對象,線程池中開辟四個(gè)線程對象,并行4個(gè)線程處理四個(gè)阻塞操作
pool = Pool(4)
#將列表中的每一個(gè)列表元素(可迭代對象)傳遞給xx函數(shù)(發(fā)生阻塞的操作)進(jìn)行處理
#map方法會有一個(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異步多線程與線程池的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 6.7 編寫printTable()函數(shù)表格打印(完整代碼)
這篇文章主要介紹了python 6.7 編寫一個(gè)名為printTable()的函數(shù) 表格打印,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Pandas中Series的創(chuàng)建及數(shù)據(jù)類型轉(zhuǎn)換
這篇文章主要介紹了Pandas中Series的創(chuàng)建及數(shù)據(jù)類型轉(zhuǎn)換,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限)
這篇文章主要介紹了Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python利用PyQt5設(shè)計(jì)鼠標(biāo)顯示形狀
不知道大家有沒有發(fā)現(xiàn),我們在網(wǎng)頁移動鼠標(biāo)時(shí),不同的網(wǎng)頁會有不同的鼠標(biāo)移動特效,通過移動鼠標(biāo),會形成類似蜘蛛網(wǎng)等等的特效,本文將用PyQt5實(shí)現(xiàn)這一特效,需要的可以參考一下2024-07-07
關(guān)于PySnooper 永遠(yuǎn)不要使用print進(jìn)行調(diào)試的問題
這篇文章主要介紹了關(guān)于PySnooper 永遠(yuǎn)不要使用print進(jìn)行調(diào)試的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里
這篇文章主要介紹了python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里?下面小編就為大家介紹一下實(shí)現(xiàn)方式,一起跟隨小編過來看看吧2021-01-01

