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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python使用xmlrpc实例讲解
Dec 17 Python
python计算圆周长、面积、球体体积并画出圆
Apr 08 Python
python多进程操作实例
Nov 21 Python
Python中用altzone()方法处理时区的教程
May 22 Python
python插入排序算法实例分析
Jul 03 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
Python timeit模块的使用实践
Jan 13 Python
Django关于admin的使用技巧和知识点
Feb 10 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中数组首字符过滤功能代码
2012/07/31 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
python 中if else 语句的作用及示例代码
2018/03/05 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
教师实习自我鉴定
2013/12/13 职场文书
优秀经理事迹材料
2014/02/01 职场文书
个人投资计划书
2014/05/01 职场文书