Python 多線程抓取圖片效率對比
更新時間:2016年02月27日 09:27:05 投稿:hebedich
Python由于有全鎖局的存在,并不能利用多核優(yōu)勢。所以,如果你的多線程進程是CPU密集型的,那多線程并不能帶來效率上的提升,相反還可能會因為線程的頻繁切換,導(dǎo)致效率下降;如果是IO密集型,多線程進程可以利用IO阻塞等待時的空閑時間執(zhí)行其他線程,提升效率。
目的:
是學(xué)習(xí)python 多線程的工作原理,及通過抓取400張圖片這種IO密集型應(yīng)用來查看多線程效率對比
import requests import urlparse import os import time import threading import Queue path = '/home/lidongwei/scrapy/owan_img_urls.txt' #path = '/home/lidongwei/scrapy/cc.txt' fetch_img_save_path = '/home/lidongwei/scrapy/owan_imgs/' # 讀取保存再文件里面400個urls with open(path) as f : urls = f.readlines() urls = urls[:400] # 使用Queue來線程通信,因為隊列是線程安全的(就是默認(rèn)這個隊列已經(jīng)有鎖) q = Queue.Queue() for url in urls: q.put(url) start = time.time() def fetch_img_func(q): while True: try: # 不阻塞的讀取隊列數(shù)據(jù) url = q.get_nowait() i = q.qsize() except Exception, e: print e break; print 'Current Thread Name Runing %s ... 11' % threading.currentThread().name url = url.strip() img_path = urlparse.urlparse(url).path ext = os.path.splitext(img_path)[1] print 'handle %s pic... pic url %s ' % (i, url) res = requests.get(url, stream=True) if res.status_code == 200: save_img_path = '%s%s%s' % (fetch_img_save_path, i, ext) # 保存下載的圖片 with open(save_img_path, 'wb') as fs: for chunk in res.iter_content(1024): fs.write(chunk) print 'save %s pic ' % i # 可以開多個線程測試不同效果 t1 = threading.Thread(target=fetch_img_func, args=(q, ), name="child_thread_1") #t2 = threading.Thread(target=fetch_img_func, args=(q, ), name="child_thread_2") #t3 = threading.Thread(target=fetch_img_func, args=(q, ), name="child_thread_3") #t4 = threading.Thread(target=fetch_img_func, args=(q, ), name="child_thread_4") t1.start() #t2.start() #t3.start() #t4.start() t1.join() #t2.join() #t3.join() #t4.join() end = time.time() print 'Done %s ' % (end-start)
實驗結(jié)果
400圖片
4線程 Done 12.443133831 3線程 Done 12.9201757908 2線程 Done 32.8628299236 1線程 Done 54.6115460396
總結(jié)
Python 自帶GIL 大鎖, 沒有真正意義上的多線程并行執(zhí)行。GIL 大鎖會在線程阻塞的時候釋放,此時等待的線程就可以激活工作,這樣如此類推,大大提高IO阻塞型應(yīng)用的效率。
相關(guān)文章
Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)
在圖像的任務(wù)中,不管是圖像檢測還是圖像識別,我們都需要通過繪制圖形和繪制文字對處理的結(jié)果進行說明,本篇就詳細(xì)介紹下OpenCV中的圖形的繪制,感興趣的可以了解一下2022-01-01基于Python實現(xiàn)對Excel工作表中的數(shù)據(jù)進行排序
在Excel中,排序是整理數(shù)據(jù)的一種重要方式,它可以讓你更好地理解數(shù)據(jù),本文將介紹如何使用第三方庫Spire.XLS?for?Python通過Python來對Excel中的數(shù)據(jù)進行排序,需要的可以參考下2024-03-03Python實現(xiàn)五子棋人機對戰(zhàn)?和人人對戰(zhàn)
這篇文章主要介紹了Python實現(xiàn)五子棋人機對戰(zhàn)?和人人對戰(zhàn),通過定義黑白子,落子位置以及獲勝規(guī)則展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05