網(wǎng)頁爬蟲 - python的多進(jìn)程怎么配合requests
問題描述
這是單進(jìn)程順序執(zhí)行的代碼:
import requests,time,os,randomdef img_down(url): with open('{}'.format(str(random.random())+os.path.basename(url)),'wb') as fob:fob.write(requests.get(url).content)urllist=[]with open('urllist.txt','r+') as u: for a in u.readlines():urllist.append(a.strip())s=time.clock()for i in range(len(urllist)): img_down(urllist[i])e=time.clock()print ('time: %d' % (e-s))
這是多進(jìn)程的代碼:
from multiprocessing import Poolimport requests,os,time,randomdef img_down(url): with open('{}'.format(str(random.random())+os.path.basename(url)),'wb') as fob:fob.write(requests.get(url).content)if __name__=='__main__': urllist=[] with open('urllist.txt','r+') as urlfob:for s in urlfob.readlines(): urllist.append(s.strip()) s=time.clock() p=Pool() for i in range(len(urllist)):p.apply_async(img_down,args=(urllist[i],)) p.close() p.join() e=time.clock()print ('time: {}'.format(e-s))
但是單進(jìn)程和多進(jìn)程花費(fèi)的時(shí)間幾乎沒區(qū)別,問題大概是requests阻塞IO,請問理解的對不對,代碼該怎么修改達(dá)到多進(jìn)程的目的?謝謝!
問題解答
回答1:寫文件的瓶頸在磁盤IO,并不在CPU,你并行并沒有多大作用,你可以試試不要寫入文件再對比時(shí)間
回答2:Pool 不帶參數(shù)的話 是采用 os.cpu_count() or 1如果是單核CPU,或者采集不到數(shù)量 就只有1個(gè)進(jìn)程而已。
應(yīng)該是這個(gè)原因。
相關(guān)文章:
1. javascript - vscode alt+shift+f 格式化js代碼,通不過eslint的代碼風(fēng)格檢查怎么辦。。。2. javascript - 如何將一個(gè)div始終固定在某個(gè)位置;無論屏幕和分辨率怎么變化;div位置始終不變3. html5 - 有可以一次性把所有 css外部樣式轉(zhuǎn)為html標(biāo)簽內(nèi)style=" "的方法嗎?4. javascript - 有什么比較好的網(wǎng)頁版shell前端組件?5. java - 如何寫一個(gè)intellij-idea插件,實(shí)現(xiàn)編譯時(shí)修改源代碼的目的6. javascript - 原生canvas中如何獲取到觸摸事件的canvas內(nèi)坐標(biāo)?7. java 中Long 類型如何轉(zhuǎn)換成Double?8. javascript - 求解答:實(shí)例對象調(diào)用constructor,此時(shí)constructor內(nèi)的this的指向?9. html - vue項(xiàng)目中用到了elementUI問題10. javascript - [js]為什么畫布里不出現(xiàn)圖片呢?在線等
