一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python 多線程抓取圖片效率對比

Python 多線程抓取圖片效率對比

2020-08-13 11:00腳本之家 Python

Python由于有全鎖局的存在,并不能利用多核優勢。所以,如果你的多線程進程是CPU密集型的,那多線程并不能帶來效率上的提升,相反還可能會因為線程的頻繁切換,導致效率下降;如果是IO密集型,多線程進程可以利用IO阻塞等待

目的:

是學習python 多線程的工作原理,及通過抓取400張圖片這種IO密集型應用來查看多線程效率對比

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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圖片

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

總結

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品极品美女自在线 | 亚洲第一综合天堂另类专 | 牧教师在线观看 | 国产亚洲欧美在线中文bt天堂网 | 成年人免费观看视频网站 | 色老板美国在线观看 | 成人私人影院www片免费高清 | 美女18隐私羞羞视频网站 | 精品久久看 | 色中色官网 | 日本一区二区免费在线 | 久久亚洲精品中文字幕60分钟 | 日本xx高清视频免费观看 | 97久久免费视频 | 免费日本在线视频 | 175m美女被网友灌醉啪啪玩脚 | 亚洲欧美日韩国产一区图片 | 饭冈加奈子在线播放观看 | 青青草成人在线 | 桃色视频破解版 | 国产亚洲精品激情一区二区三区 | 9420高清完整版在线观看国语 | 男人j放进女人的p视频免费 | 色姑娘久久 | caoporm碰最新免费公开视频 | 明星ai智能人脸替换造梦在线播放 | 亚洲国产欧美在线成人aaaa | 国产老村长足疗店对白 | 国亚洲欧美日韩精品 | 女人被爽到呻吟娇喘的视频动态图 | 9966久久精品免费看国产 | 亚洲AV永久无码精品澳门 | 免费一级片在线观看 | 国产午夜精品久久理论片小说 | 亚洲99久久无色码中文字幕 | 日韩欧美亚洲每日更新网 | 国产成人看片免费视频观看 | porno18老师hd| 国产日韩一区二区三区在线播放 | 午夜国产精品视频 | 男人的j伸到女人的屁股眼 男人吃奶动态图 |