摘要:大鎖會在線程阻塞的時候釋放,此時等待的線程就可以激活工作,這樣如此類推,大大提高阻塞型應用的效率。
Python 多線程抓取圖片效率實驗 實驗目的:
是學習python 多線程的工作原理,及通過抓取400張圖片這種IO密集型應用來查看多線程效率對比
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來線程通信,因為隊列是線程安全的(就是默認這個隊列已經有鎖) q = Queue.Queue() for url in urls: q.put(url) start = time.time() def fetch_img_func(q): while True: try: # 不阻塞的讀取隊列數據 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)實驗結果
400圖片 4線程 Done 12.443133831 3線程 Done 12.9201757908 2線程 Done 32.8628299236 1線程 Done 54.6115460396總結
Python 自帶GIL 大鎖, 沒有真正意義上的多線程并行執行。GIL 大鎖會在線程阻塞的時候釋放,此時等待的線程就可以激活工作,這樣如此類推,大大提高IO阻塞型應用的效率。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37768.html
摘要:批評的人通常都會說的多線程編程太困難了,眾所周知的全局解釋器鎖,或稱使得多個線程的代碼無法同時運行。多線程起步首先讓我們來創建一個名為的模塊。多進程可能比多線程更易使用,但需要消耗更大的內存。 批評 Python 的人通常都會說 Python 的多線程編程太困難了,眾所周知的全局解釋器鎖(Global Interpreter Lock,或稱 GIL)使得多個線程的 Python 代碼無...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:使用進行并發編程篇三掘金這是使用進行并發編程系列的最后一篇。所以我考慮啟用一個本地使用進行并發編程篇二掘金我們今天繼續深入學習。 使用 Python 進行并發編程 - asyncio 篇 (三) - 掘金 這是「使用Python進行并發編程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新實驗上篇的效率對比的實現 在第一篇我們曾經對比并發執行的效率,但是請求的是httpb...
摘要:學習網絡爬蟲主要分個大的版塊抓取,分析,存儲另外,比較常用的爬蟲框架,這里最后也詳細介紹一下。網絡爬蟲要做的,簡單來說,就是實現瀏覽器的功能。 Python學習網絡爬蟲主要分3個大的版塊:抓取,分析,存儲 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細介紹一下。 首先列舉一下本人總結的相關文章,這些覆蓋了入門網絡爬蟲需要的基本概念和技巧:寧哥的小站-網絡爬蟲,當我們在瀏覽器中輸入...
摘要:使用的爬蟲知乎用戶數據爬取和分析閱讀掘金背景說明小拽利用的寫的爬蟲,實驗性的爬取了知乎用戶的基本信息同時,針對爬取的數據,進行了簡單的分析呈現。 Python 知乎爬蟲(最新) - 后端 - 掘金 環境:python3.x外部依賴包:requestsgithub項目地址 主要的問題:模擬登陸: 知乎現在改用https請求了,數據加密,但是問題不大,重要的是網頁數據改動了,而且在請求時后...
閱讀 2643·2021-11-11 16:55
閱讀 680·2021-09-04 16:40
閱讀 3078·2019-08-30 15:54
閱讀 2615·2019-08-30 15:54
閱讀 2403·2019-08-30 15:46
閱讀 404·2019-08-30 15:43
閱讀 3227·2019-08-30 11:11
閱讀 2983·2019-08-28 18:17