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异步多线程与线程池的资料请关注脚本之家其它相关文章!

相关文章

  • 解决torch.to(device)是否赋值的坑

    解决torch.to(device)是否赋值的坑

    这篇文章主要介绍了解决torch.to(device)是否赋值的坑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • python中字符串比较使用is、==和cmp()总结

    python中字符串比较使用is、==和cmp()总结

    在Python中比较字符串最好是使用简单逻辑操作符,今天为大家讲解一下is、==和cmp()使用总结
    2018-03-03
  • Python线程之同步机制实际应用场景举例说明

    Python线程之同步机制实际应用场景举例说明

    这篇文章主要给大家分享的是Python线程之同步机制实际应用场景举例说明,银行转账小栗子供大家参考学习,希望对你有一定的帮助
    2022-02-02
  • Python中声明只包含一个元素的元组数据方法

    Python中声明只包含一个元素的元组数据方法

    这篇文章主要介绍了Python中声明只包含一个元素的元组数据方法,本文是实际经验总结而来,没有碰到这个需要可能不会注意到这个问题,需要的朋友可以参考下
    2014-08-08
  • Python中list的交、并、差集获取方法示例

    Python中list的交、并、差集获取方法示例

    这篇文章主要介绍了Python中list的交、并、差集获取方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python打开网页和暂停实例

    python打开网页和暂停实例

    这篇文章主要介绍了python打开网页和暂停实例,涉及webbrowser模块与os模块的使用,是非常具有实用价值的一个技巧,需要的朋友可以参考下
    2014-09-09
  • python爬虫学习笔记--BeautifulSoup4库的使用详解

    python爬虫学习笔记--BeautifulSoup4库的使用详解

    这篇文章主要介绍了Python中使用Beautiful Soup库的超详细教程,示例代码基于Python2.x版本,极力推荐!需要的朋友可以参考下
    2021-08-08
  • flask框架蓝图和子域名配置详解

    flask框架蓝图和子域名配置详解

    这篇文章主要介绍了flask框架蓝图和子域名配置,结合实例形式详细分析了flask框架蓝图和子域名配置相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2020-01-01
  • python 实现仿微信聊天时间格式化显示的代码

    python 实现仿微信聊天时间格式化显示的代码

    这篇文章主要介绍了python 实现仿微信聊天时间格式化显示,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04
  • Python中的枚举函数enumerate()的具体用法

    Python中的枚举函数enumerate()的具体用法

    本文主要介绍了Python中的枚举函数enumerate()的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论