资讯专栏INFORMATION COLUMN

Python 多线程抓取图片效率实验

fevin / 1115人阅读

摘要:大锁会在线程阻塞的时候释放,此时等待的线程就可以激活工作,这样如此类推,大大提高阻塞型应用的效率。

Python 多线程抓取图片效率实验 实验目的:

是学习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阻塞型应用的效率。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37768.html

相关文章

  • 通过网络图片小爬虫对比Python中单线程线(进)程的效率

    摘要:批评的人通常都会说的多线程编程太困难了,众所周知的全局解释器锁,或称使得多个线程的代码无法同时运行。多线程起步首先让我们来创建一个名为的模块。多进程可能比多线程更易使用,但需要消耗更大的内存。 批评 Python 的人通常都会说 Python 的多线程编程太困难了,众所周知的全局解释器锁(Global Interpreter Lock,或称 GIL)使得多个线程的 Python 代码无...

    W4n9Hu1 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • 使用 Python 进行并发编程系列 - 收藏集 - 掘金

    摘要:使用进行并发编程篇三掘金这是使用进行并发编程系列的最后一篇。所以我考虑启用一个本地使用进行并发编程篇二掘金我们今天继续深入学习。 使用 Python 进行并发编程 - asyncio 篇 (三) - 掘金 这是「使用Python进行并发编程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新实验上篇的效率对比的实现 在第一篇我们曾经对比并发执行的效率,但是请求的是httpb...

    MorePainMoreGain 评论0 收藏0
  • Python入门网络爬虫之精华版

    摘要:学习网络爬虫主要分个大的版块抓取,分析,存储另外,比较常用的爬虫框架,这里最后也详细介绍一下。网络爬虫要做的,简单来说,就是实现浏览器的功能。 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫,当我们在浏览器中输入...

    Bmob 评论0 收藏0
  • 爬虫 - 收藏集 - 掘金

    摘要:使用的爬虫知乎用户数据爬取和分析阅读掘金背景说明小拽利用的写的爬虫,实验性的爬取了知乎用户的基本信息同时,针对爬取的数据,进行了简单的分析呈现。 Python 知乎爬虫(最新) - 后端 - 掘金 环境:python3.x外部依赖包:requestsgithub项目地址 主要的问题:模拟登陆: 知乎现在改用https请求了,数据加密,但是问题不大,重要的是网页数据改动了,而且在请求时后...

    zzbo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<