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 相关文章推荐
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
python3实现名片管理系统
Nov 29 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
python pyhs2 的安装操作
Apr 07 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 上传文件的方法(类)
2009/07/30 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
php二分查找二种实现示例
2014/03/12 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
javascript self对象使用详解
2016/10/18 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
python使用pil生成缩略图的方法
2015/03/26 Python
浅谈python中set使用
2016/06/30 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
王老吉广告词
2014/03/20 职场文书
公司经理任命书
2014/06/05 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书