Python异步爬虫多线程与线程池示例详解
目录
- 背景
- 异步爬虫方式
- 多线程,多进程(不建议)
- 线程池,进程池(适当使用)
- 单线程+异步协程(推荐)
- 多线程
- 线程池
背景 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的。那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求
异步爬虫方式
多线程,多进程(不建议)
好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行
弊端:不能无限制开启多线程或者多进程(需要频繁的创建或者销毁进程,线程)
线程池,进程池(适当使用)
好处:可以降低系统对进程或线程创建和销毁的频率,从而很好的而降低系统的开销
弊端:线程或进程池中的数量是有上限的
单线程+异步协程(推荐)
多线程 正常运行如下的代码,需要花费8秒钟的时间,因为sleep是一个阻塞的操作,在等待的时候不会执行别的操作,极大地降低了效率
from time import sleepimport timestart = 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 Threadfrom time import sleepimport timestart = 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 Poolfrom time import sleepimport timestart = 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异步爬虫多线程与线程池示例详解的详细内容,更多关于Python异步多线程与线程池的资料请关注脚本之家其它相关文章!
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)
- 爬虫数据处理HTML转义字符