python并发模块之concurrent.futures(二)

上次我们简单的了解下,模块的一些基本方法和用法,这里我们进一步对concurrent.futures做一个了解和拓展.
上次的内容点这。
python并发模块之concurrent.futures(二)
以下载图片为例子,下面的程序是顺序下载http://www.58pic.com/newpic/28660111.html网站的24个表情 。

from requests_html import HTMLSession
import os
import time
BASE_PATH="downloads"
class Get_Image():
    def __init__(self):
        self.timeout=20
        self.session=HTMLSession()
    def getiamge(self,url):
        req=self.session.get(url,timeout=self.timeout)
        if req.status_code==200:
            imgurllist=req.html.xpath("//ul[@class='emoticon-model']/li/img/@data-big")
            for index,url in enumerate(imgurllist):
                print(f"开始下载第{index+1}张图片")
                self.save_image(url,index+1)
        else:
            print("下载失败")
    def save_image(self,imgurl,index):
        print(f"当前下载链接:{imgurl}")
        buff=self.session.get(imgurl,timeout=self.timeout).content
        file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),BASE_PATH)
        if not os.path.exists(file_path):
            os.makedirs(file_path)
        with open(os.path.join(file_path,f"{index}.png"),"wb") as fs:
            fs.write(buff)
if __name__ == '__main__':
    start_url="http://www.58pic.com/newpic/28660111.html"
    start=time.time()
    Get_Image().getiamge(start_url)
    end=time.time()
    print(f"顺序下载24张图片用时:{end-start}")
#运行了两次结果分别为
#顺序下载24张图片用时:14.926000356674194
#顺序下载24张图片用时:14.07800030708313

使用concurrent.futures修改成并发之后

from requests_html import HTMLSession
import os
import time
from concurrent.futures import ThreadPoolExecutor
BASE_PATH="downloads"
MAX_WORKERS = 10 #最多使用10个线程
class Get_Image():
    def __init__(self):
        self.timeout=20
        self.session=HTMLSession()
    def getiamge(self,url):
        req=self.session.get(url,timeout=self.timeout)
        if req.status_code==200:
            imgurllist=req.html.xpath("//ul[@class='emoticon-model']/li/img/@data-big")
            works=min(len(imgurllist),MAX_WORKERS)
            with ThreadPoolExecutor(works) as excutor:
                res=excutor.map(self.save_image,imgurllist,range(1,25))
            return len(list(res))
        else:
            print("下载失败")
    def save_image(self,imgurl,index):
        print(f"当前下载链接:{imgurl}")
        buff=self.session.get(imgurl,timeout=self.timeout).content
        file_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),BASE_PATH)
        if not os.path.exists(file_path):
            os.makedirs(file_path)
        with open(os.path.join(file_path,f"{index}.png"),"wb") as fs:
            fs.write(buff)
if __name__ == '__main__':
    start_url="http://www.58pic.com/newpic/28660111.html"
    start=time.time()
    Get_Image().getiamge(start_url)
    end=time.time()
    print(f"并发下载24张图片用时:{end-start}")
#运行了两次结果分别为
#并发下载24张图片用时:7.737000226974487
#并发下载24张图片用时:7.083999872207642

通过观察发现速度并发之后效率大大提高了。

python并发模块之concurrent.futures(二)的更多相关文章

  1. python并发模块之concurrent.futures(一)

    Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threadin ...

  2. python3 线程池-threadpool模块与concurrent.futures模块

    多种方法实现 python 线程池 一. 既然多线程可以缩短程序运行时间,那么,是不是线程数量越多越好呢? 显然,并不是,每一个线程的从生成到消亡也是需要时间和资源的,太多的线程会占用过多的系统资源( ...

  3. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  4. Python3【模块】concurrent.futures模块,线程池进程池

    Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要 ...

  5. python基础-------模块与包(二)

    sys模块.logging模块.序列化 一.sys模块 sys.argv           命令行参数List,第一个元素是程序本身路径 sys.exit(n)        退出程序,正常退出时e ...

  6. Python命令模块argparse学习笔记(二)

    argparse模块可以设置两种命令参数,一个是位置参数,一个是命令参数 位置参数 import argparse parser = argparse.ArgumentParser(descripti ...

  7. Python日志模块的管理(二)

    日志模块可以通过封装一个类,也可以通过配置文件取管理 新建1个log.ini文件 [loggers] keys=root [handlers] keys=fileHandler,streamHandl ...

  8. Python学习-4.Python的模块加载(二)

    1.部分函数加载 from SameFolder import printSameFolder printSameFolder() 该代码指从SameFolder.py中加载printSameFold ...

  9. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

随机推荐

  1. [HAOI2007]分割矩阵 DP+推式子

    发现最近好少写博客啊(其实是各种摆去了) 更一点吧 这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的, 首先f[i][j][k][l][t]表示以( ...

  2. 数据库sharding,横向扩展

    学习资料如下: http://www.cnblogs.com/skyme/p/3459765.html http://my.oschina.net/anthonyyau/blog/307165 htt ...

  3. CentOS安装pip

    环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 先安装setuptools和wget yum -y install wget wget https://pypi.p ...

  4. ACE线程管理机制-并发控制(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/04/581771.html ACE Lock类属 锁类属包含的类包装简单的锁定机制,比如互斥体 ...

  5. 牛客练习赛42 出题的诀窍(数学+hash)

    出题的诀窍 题目链接:https://ac.nowcoder.com/acm/contest/393/C 题解: 由于他是在每一行选取一个元素,然后纵向来比较,这里行的顺序是不会影响的,所以我们将每一 ...

  6. AppWidget学习总结

    AppWidget学习总结 一.创建AppWidget.    1.在res/xml下创建一个xml文件,以设置widget占用的空间等信息.如widget_provider.xml        & ...

  7. ACM1325Is it A tree?

    通过这道简单而又坑人的题目,练习并查集和set 容器的使用: Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  8. Leetcode 557. 反转字符串中的单词 III

    1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" ...

  9. phpstorm license 解决

    http://idea.lanyus.com/ sudo vim /etc/hosts 最后添加:  0.0.0.0 account.jetbrains.com 然后把获得的注册码,复制到,licen ...

  10. 解决华为手机用rem单位,内容超出屏幕宽度问题

    在H5手机页面上,用rem单位布局,配合js计算出一个根节点的font-size(原理是屏幕宽度乘以一个固定比例,如1/100),之后页面中所有的px全都换算成了rem单位来写,优点是能适配各种不同屏 ...