Python异步爬虫多线程与线程池示例详解

 更新时间:2021年09月29日 16:14:55   作者:小缘喵~  
这篇文章主要为大家介绍了Python异步爬虫多线程与线程池示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

背景

当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的。那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求

异步爬虫方式

多线程,多进程(不建议)

好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行

弊端:不能无限制开启多线程或者多进程(需要频繁的创建或者销毁进程,线程)

线程池,进程池(适当使用)

好处:可以降低系统对进程或线程创建和销毁的频率,从而很好的而降低系统的开销

弊端:线程或进程池中的数量是有上限的

单线程+异步协程(推荐)

多线程

正常运行如下的代码,需要花费8秒钟的时间,因为sleep是一个阻塞的操作,在等待的时候不会执行别的操作,极大地降低了效率

from time import sleep
import time
start = time.time()
def xx(str):
    print('正在下载:', str)
    sleep(2)
str = ['xiaozi', 'aa', 'bb', 'cc']
for i in str:
    xx(i)
end = time.time()
print('程序运行时间:',end-start)

使用多线程后

from threading import Thread
from time import sleep
import time
start = time.time()
def xx(str):
        print('正在下载:',str)
        sleep(2)
str =  ['xiaozi','aa','bb','cc']
def main():
    for s in str:
        #开启线程,target=函数名,args=(xx,) ,xx为向函数传递的参数,必须为元组类型,所以后面需要加,
        t = Thread(target=xx,args=(s,))
        t.start()
if __name__ == '__main__':
    main()
    end = time.time()
    print('程序运行时间:',end-start)

但是我们发现下面的运行顺序貌似有点乱的

线程池

对上面的改为线程池后运行

#倒入线程池模块对应的类
from multiprocessing.dummy import Pool
from time import sleep
import time
start = time.time()
def xx(str):
        print('正在下载:',str)
        sleep(2)
str =  ['xiaozi','aa','bb','cc']
#实例化一个线程池对象,线程池中开辟四个线程对象,并行4个线程处理四个阻塞操作
pool = Pool(4)
#将列表中的每一个列表元素(可迭代对象)传递给xx函数(发生阻塞的操作)进行处理
#map方法会有一个返回值为函数的返回值(一个列表),但是这里没有返回值所以不考虑
#调用map方法
pool.map(xx,str)
end = time.time()
print('程序运行时间:',end-start)

以上就是Python异步爬虫多线程与线程池示例详解的详细内容,更多关于Python异步多线程与线程池的资料请关注脚本之家其它相关文章!

相关文章

  • Selenium定时刷新网页的实现代码

    Selenium定时刷新网页的实现代码

    这篇文章主要介绍了Selenium定时刷新网页的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Python内置方法实现字符串的秘钥加解密(推荐)

    Python内置方法实现字符串的秘钥加解密(推荐)

    在Python中实现AES算法需要借助的第三方库Crypto,其在各个操作系统上的安装方法有些许复杂,所以对于简单的使用有点杀鸡用牛刀的意思。这篇文章主要介绍了利用Python内置方法实现字符串的秘钥加解密,需要的朋友可以参考下
    2019-12-12
  • 教你用Type Hint提高Python程序开发效率

    教你用Type Hint提高Python程序开发效率

    本文通过介绍和实例教大家如何利用Type Hint来提升Python程序开发效率,对大家使用python开发很有帮助,有需要的参考学习。
    2016-08-08
  • Django报错TemplateDoesNotExist的问题及解决

    Django报错TemplateDoesNotExist的问题及解决

    这篇文章主要介绍了Django报错TemplateDoesNotExist的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python 基于opencv操作摄像头

    python 基于opencv操作摄像头

    这篇文章主要介绍了python 基于opencv操作摄像头的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • 恢复百度云盘本地误删的文件脚本(简单方法)

    恢复百度云盘本地误删的文件脚本(简单方法)

    下面小编就为大家带来一篇恢复百度云盘本地误删的文件脚本(简单方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Django models文件模型变更错误解决

    Django models文件模型变更错误解决

    这篇文章主要介绍了Django models文件模型变更错误解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python如何求数组连续最大和的示例代码

    python如何求数组连续最大和的示例代码

    这篇文章主要介绍了python如何求数组连续最大和的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • numpy中nan_to_num的具体使用

    numpy中nan_to_num的具体使用

    在Numpy中NaN值一般出现在数据清洗前,出现这个值说明这个数据是缺失的,本文主要介绍了numpy中nan_to_num的具体使用,感兴趣的可以了解一下
    2022-08-08
  • 快速了解Python相对导入

    快速了解Python相对导入

    这篇文章主要介绍了快速了解Python相对导入,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论