最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 多線程抓取圖片效率對(duì)比

 更新時(shí)間:2016年02月27日 09:27:05   投稿:hebedich  
Python由于有全鎖局的存在,并不能利用多核優(yōu)勢(shì)。所以,如果你的多線程進(jìn)程是CPU密集型的,那多線程并不能帶來效率上的提升,相反還可能會(huì)因?yàn)榫€程的頻繁切換,導(dǎo)致效率下降;如果是IO密集型,多線程進(jìn)程可以利用IO阻塞等待時(shí)的空閑時(shí)間執(zhí)行其他線程,提升效率。

目的:

是學(xué)習(xí)python 多線程的工作原理,及通過抓取400張圖片這種IO密集型應(yīng)用來查看多線程效率對(duì)比

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個(gè)urls
with open(path) as f :
  urls = f.readlines()

urls = urls[:400]
# 使用Queue來線程通信,因?yàn)殛?duì)列是線程安全的(就是默認(rèn)這個(gè)隊(duì)列已經(jīng)有鎖)
q = Queue.Queue()
for url in urls:
  q.put(url)

start = time.time()

def fetch_img_func(q):
  while True:
    try:
      # 不阻塞的讀取隊(duì)列數(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

# 可以開多個(gè)線程測(cè)試不同效果
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)

實(shí)驗(yàn)結(jié)果

400圖片

4線程 Done 12.443133831
3線程 Done 12.9201757908 
2線程 Done 32.8628299236
1線程 Done 54.6115460396 

總結(jié)

Python 自帶GIL 大鎖, 沒有真正意義上的多線程并行執(zhí)行。GIL 大鎖會(huì)在線程阻塞的時(shí)候釋放,此時(shí)等待的線程就可以激活工作,這樣如此類推,大大提高IO阻塞型應(yīng)用的效率。

相關(guān)文章

  • 在Python中使用AOP實(shí)現(xiàn)Redis緩存示例

    在Python中使用AOP實(shí)現(xiàn)Redis緩存示例

    本篇文章主要介紹了在Python中使用AOP實(shí)現(xiàn)Redis緩存示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • OpenCV 圖像梯度的實(shí)現(xiàn)方法

    OpenCV 圖像梯度的實(shí)現(xiàn)方法

    梯度簡(jiǎn)單來說就是求導(dǎo)。本文主要介紹了OpenCV 圖像梯度的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Python tkinter三種布局實(shí)例詳解

    Python tkinter三種布局實(shí)例詳解

    這篇文章主要介紹了Python tkinter三種布局實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • pyinstaller封裝exe的操作

    pyinstaller封裝exe的操作

    這篇文章主要介紹了pyinstaller封裝exe的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python二叉樹初識(shí)(新手也秒懂!)

    Python二叉樹初識(shí)(新手也秒懂!)

    二叉樹是一種簡(jiǎn)單的樹形結(jié)構(gòu),其每個(gè)節(jié)點(diǎn)的分支節(jié)點(diǎn)數(shù)有0,1或2個(gè),下面這篇文章主要給大家介紹了關(guān)于Python二叉樹的相關(guān)資料,本文介紹的非常通俗易懂,新手也秒懂,需要的朋友可以參考下
    2022-05-05
  • PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例

    PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Python 圖像處理之PIL庫詳解用法

    Python 圖像處理之PIL庫詳解用法

    對(duì)于圖像識(shí)別,大量的工作在于圖像的處理,處理效果好,那么才能很好地識(shí)別,因此,良好的圖像處理是識(shí)別的基礎(chǔ)。在Python中,有一個(gè)優(yōu)秀的圖像處理框架,就是PIL庫,本文會(huì)介紹PIL庫中的各種方法,并列舉相關(guān)例子
    2021-11-11
  • SQLAlchemy的主要組件詳細(xì)講解

    SQLAlchemy的主要組件詳細(xì)講解

    SQLAlchemy是一個(gè)基于Python實(shí)現(xiàn)的ORM框架,能滿足大多數(shù)數(shù)據(jù)庫操作需求,同時(shí)支持多種數(shù)據(jù)庫引擎(SQLite,MySQL,Postgresql,Oracle等),這篇文章主要介紹了SQLAlchemy的主要組件有哪些,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考
    2023-08-08
  • python實(shí)現(xiàn)階乘的三種方法

    python實(shí)現(xiàn)階乘的三種方法

    階乘是基斯頓·卡曼于 1808 年發(fā)明的運(yùn)算符號(hào),是數(shù)學(xué)術(shù)語,一個(gè)正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且0的階乘為1,本文給大家介紹了python實(shí)現(xiàn)階乘的三種方法,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Python實(shí)現(xiàn)投影法分割圖像示例(一)

    Python實(shí)現(xiàn)投影法分割圖像示例(一)

    今天小編就為大家分享一篇Python實(shí)現(xiàn)投影法分割圖像示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評(píng)論

湛江市| 和田市| 南汇区| 兴和县| 喜德县| 伊春市| 通州市| 凤阳县| 会同县| 济源市| 防城港市| 灵寿县| 沈阳市| 桐城市| 合肥市| 汤阴县| 卫辉市| 永定县| 徐州市| 高清| 蛟河市| 北川| 马龙县| 习水县| 宁都县| 乌兰县| 萨迦县| 利辛县| 镇赉县| 惠来县| 榆树市| 合川市| 龙川县| 通辽市| 临武县| 敦化市| 上林县| 介休市| 迭部县| 秭归县| 隆林|