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的汉字转GBK码实现代码
Feb 19 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python如何获取apk的packagename和activity
Jan 10 Python
基于plt.title无法显示中文的快速解决
May 16 Python
基于python实现图片转字符画代码实例
Sep 04 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 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
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
python如何去除字符串中不想要的字符
2020/07/05 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
python如何从键盘获取输入实例
2020/06/18 Python
python图片合成的示例
2020/11/09 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
开放系统互连参考模型
2016/06/29 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
我们的节日清明节活动方案
2014/03/05 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle