摘要:大鎖會在線程阻塞的時候釋放,此時等待的線程就可以激活工作,這樣如此類推,大大提高阻塞型應(yīng)用的效率。
Python 多線程抓取圖片效率實驗 實驗?zāi)康?
是學(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來線程通信,因為隊列是線程安全的(就是默認這個隊列已經(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)用的效率。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37768.html
摘要:批評的人通常都會說的多線程編程太困難了,眾所周知的全局解釋器鎖,或稱使得多個線程的代碼無法同時運行。多線程起步首先讓我們來創(chuàng)建一個名為的模塊。多進程可能比多線程更易使用,但需要消耗更大的內(nèi)存。 批評 Python 的人通常都會說 Python 的多線程編程太困難了,眾所周知的全局解釋器鎖(Global Interpreter Lock,或稱 GIL)使得多個線程的 Python 代碼無...
摘要:以下這些項目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個步驟都能做到很優(yōu)秀的時候,你應(yīng)該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:使用進行并發(fā)編程篇三掘金這是使用進行并發(fā)編程系列的最后一篇。所以我考慮啟用一個本地使用進行并發(fā)編程篇二掘金我們今天繼續(xù)深入學(xué)習(xí)。 使用 Python 進行并發(fā)編程 - asyncio 篇 (三) - 掘金 這是「使用Python進行并發(fā)編程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新實驗上篇的效率對比的實現(xiàn) 在第一篇我們曾經(jīng)對比并發(fā)執(zhí)行的效率,但是請求的是httpb...
摘要:學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分個大的版塊抓取,分析,存儲另外,比較常用的爬蟲框架,這里最后也詳細介紹一下。網(wǎng)絡(luò)爬蟲要做的,簡單來說,就是實現(xiàn)瀏覽器的功能。 Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個大的版塊:抓取,分析,存儲 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細介紹一下。 首先列舉一下本人總結(jié)的相關(guān)文章,這些覆蓋了入門網(wǎng)絡(luò)爬蟲需要的基本概念和技巧:寧哥的小站-網(wǎng)絡(luò)爬蟲,當(dāng)我們在瀏覽器中輸入...
摘要:使用的爬蟲知乎用戶數(shù)據(jù)爬取和分析閱讀掘金背景說明小拽利用的寫的爬蟲,實驗性的爬取了知乎用戶的基本信息同時,針對爬取的數(shù)據(jù),進行了簡單的分析呈現(xiàn)。 Python 知乎爬蟲(最新) - 后端 - 掘金 環(huán)境:python3.x外部依賴包:requestsgithub項目地址 主要的問題:模擬登陸: 知乎現(xiàn)在改用https請求了,數(shù)據(jù)加密,但是問題不大,重要的是網(wǎng)頁數(shù)據(jù)改動了,而且在請求時后...
閱讀 2655·2021-11-11 16:55
閱讀 692·2021-09-04 16:40
閱讀 3091·2019-08-30 15:54
閱讀 2631·2019-08-30 15:54
閱讀 2418·2019-08-30 15:46
閱讀 414·2019-08-30 15:43
閱讀 3240·2019-08-30 11:11
閱讀 2993·2019-08-28 18:17