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

線程池
對上面的改為線程池后運行
#倒入線程池模塊對應的類
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']
#實例化一個線程池對象,線程池中開辟四個線程對象,并行4個線程處理四個阻塞操作
pool = Pool(4)
#將列表中的每一個列表元素(可迭代對象)傳遞給xx函數(shù)(發(fā)生阻塞的操作)進行處理
#map方法會有一個返回值為函數(shù)的返回值(一個列表),但是這里沒有返回值所以不考慮
#調(diào)用map方法
pool.map(xx,str)
end = time.time()
print('程序運行時間:',end-start)

以上就是Python異步爬蟲多線程與線程池示例詳解的詳細內(nèi)容,更多關(guān)于Python異步多線程與線程池的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信