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抓取网页图片并放到指定文件夹
Apr 24 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
Django 路由控制的实现代码
Nov 08 Python
Python实现Event回调机制的方法
Feb 13 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
numpy求平均值的维度设定的例子
Aug 24 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
python中数字是否为可变类型
Jul 08 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
利用Python+OpenCV三步去除水印
May 28 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数据库开发知多少
2006/10/09 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP数组函数知识汇总
2016/05/12 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
vue项目中api接口管理总结
2018/04/20 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
Python os模块学习笔记
2015/06/21 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
syb养殖创业计划书
2014/01/09 职场文书
五年级学生评语
2014/04/22 职场文书
岗位说明书范文
2014/05/07 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS