Python 多线程抓取图片效率对比


Posted in Python onFebruary 27, 2016

目的:

是学习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阻塞型应用的效率。

Python 相关文章推荐
python基础教程之udp端口扫描
Feb 10 Python
python的三目运算符和not in运算符使用示例
Mar 03 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
Python判断文本中消息重复次数的方法
Apr 27 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
python conda操作方法
Sep 11 Python
Python hashlib模块加密过程解析
Nov 05 Python
python Plotly绘图工具的简单使用
Mar 03 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
Python 的描述符 descriptor详解
Feb 27 #Python
简析Python的闭包和装饰器
Feb 26 #Python
Android应用开发中Action bar编写的入门教程
Feb 26 #Python
12步教你理解Python装饰器
Feb 25 #Python
Python实现字典依据value排序
Feb 24 #Python
Python中方法链的使用方法
Feb 23 #Python
python开发之list操作实例分析
Feb 22 #Python
You might like
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
如何利用python 读取配置文件
2021/01/06 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
春节活动策划方案
2014/01/24 职场文书
工程招投标邀请书
2014/01/26 职场文书
请假条格式范文
2014/04/10 职场文书
法制教育演讲稿
2014/09/10 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
出差报告格式模板
2014/11/06 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript