工欲善其事,必先利其器——线程池的使用

本文探讨了Python线程池的使用,通过同步和异步代码对比,展示了线程池如何显著减少程序运行时间。同步爬虫爬取图片耗时较长,而采用线程池的异步爬虫在爬取4K美女图片时,速度大幅提升,但要注意线程池的上限问题,当数据过大时,效率可能会降低。
摘要由CSDN通过智能技术生成


学到现在,我们可以说已经学习了爬虫的基础知识,如果没有那些奇奇怪怪的反爬虫机制,基本上只要有时间分析,一般的数据都是可以爬取的,那么到了这个时候我们需要考虑的就是爬取的效率了,关于提高爬虫效率,也就是实现异步爬虫,我们可以考虑以下两种方式:一是线程池的使用(也就是实现单进程下的多线程),一是协程的使用(如果没有记错,我所使用的协程模块是从python3.4以后引入的,我写博客时使用的python版本是3.9)。

今天我们先来讲讲线程池。

同步代码演示

我们先用普通的同步的形式写一段代码

import time

def func(url):
    print("正在下载:", url)
    time.sleep(2)
    print("下载完成:", url)

if __name__ == '__main__':
    start = time.time() # 开始时间

    url_list = [
        "a", "b", "c"
    ]

    for url in url_list:
        func(url)

    end = time.time() # 结束时间

    print(end - start)

对于代码运行的结果我们心里都有数,但还是让我们来看一下吧

在这里插入图片描述
不出所料。运行时间果然是六秒

异步,线程池代码

那么如果我们使用线程池运行上述代码又会怎样呢?

import time
from multiprocessing import Pool

def func(url):
    print("正在下载:", url)
    time.sleep(2)
    print("下载完成:", url)

if __name__ == '__main__':
    start = time.time() # 开始时间

    url_list = [
        "a", "b", "c"
    ]

    pool = Pool(len(url_list)) # 实例化一个线程池对象,并且设定线程池的上限数量为列表长度。不设置上限也可以。

    pool.map(func, url_list)

    end 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值