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常用模块介绍
Nov 21 Python
Python中的is和id用法分析
Jan 26 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
如何让python的运行速度得到提升
Jul 08 Python
Python语言编写智力问答小游戏功能
Oct 13 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
Python&Matlab实现樱花的绘制
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调用mysql存储过程
2007/02/14 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
node.js的事件机制
2017/02/08 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
Python开发常用的一些开源Package分享
2015/02/14 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python变量类型知识点总结
2019/02/18 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
八年级美术教学反思
2014/02/02 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
mysql 排序失效
2022/05/20 MySQL