普通的python爬虫是单进程单线程的,这样在遇到大量重复的操作时就只能逐个进行,我们就很难过了。举个栗子:你有1000个美图的链接,逐个喂给下载器(函数),看着图片只能一个个蹦出来,你不心急吗?于是我们想,能不能同时跑多个下载器,实现多图同时下载?——答案是可以的,使用多进程/多线程,把每个带着不同参数下载器分给每个进程/线程就,然后同时跑多个进程/线程就行了。
本文就介绍如何用多线程和多进程给爬虫加速
补充主线程与子线程(进程同理):
- 一个py程序就有一个主线程,主线程负责整个py程序的代码,当主线程处理到启用多线程的代码时,就会创建若干个子线程,这里就有选择了,主线程是等待子线程的结束再继续处理还是直接继续处理让子线程在外头跑
Python标准库原本有threading和multiprocessing模块编写相应的多线程/多进程代码。但从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的更高级的抽象,对编写线程池/进程池提供了直接的支持。多进程我们介绍futures的ProcessPoolExecutor注:python 2.7 请安装future模块,pip install future
ProcessPoolExecutor类是Executor类的子类,实例化ProcessPoolExecutor类以创建进程池,在实例化的过程中应指定同时运行的最大进程数
'''
想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载!
'''
from concurrent.futures import ProcessPoolExecutor
pool = ProcessPoolExecutor(max_workers=4) # 运行最大进程数4
#进程池的操作...
pool.shutdown(wait=True) # 关闭进程池,默认等待所有进程的完成。
print('Deep') # 有shutdown的情况下所有进程完成后才会运行下面的print,没有的话会马上运行
'创建进程也可用with,这时会自带shutdown功能
with ProcessPoolExecutor(4) as pool:
#进程池的操作...
'
该类有两种方法对进程池提交任务建立进程(函数及一组参数构成一个任务),分别是submit()
和map()
,如果单纯想多开进程别无他想,用哪个都行,但submit()会有更灵活的用法
- fn:函数
- *iterables:函数每个参数的集合,N个参数就接N个集合
可以理解这是python自带map()的多进程版,他返回的是一个迭代器,包含每个任务对应的返回值(有序的),下面用例子来分析
from concurrent.futures import ProcessPoolExecutor
import time
def test(x):
time.sleep(x) # 时间阻塞
print(str(x)+'s')
return x
if __name__ == '__main__':
with ProcessPoolExecutor(4) as pool:
p = pool.map(test,[2,3,10,5,6])
for i in p:
print(i)
输出
2s
2
3s
3
5s
6s
10s
10
5
6
分析(下面以参数代替某个进程):
- 带s的是函数输出的,进程池最大允许4个进程同时运行,所以参数 2,3,10,5 首先一起进去。2最快完成,马上让给6进去,2+6
关注打赏
- Python:用tkinter制做一个音乐下载小软件
- Python丨小学妹喜欢看漫画,于是我写了四十行代码获取了它所有漫画
- 女同桌找我要表情包,还好我会Python,分分钟给她下载几十个G...
- 为了防止这上面的文章被封,我连夜用Python获取了它所有内容,真香~
- 这个Python读取文件的方法,堪称天花板级别...
- Python做一个通过输入bv号就能下载视频的工具,评论和弹幕也不放过
- Python:50行代码实现下载小说,图片章节可自动识别转文字保存...
- 只用二十行代码,用Python实现获取网抑云榜单文件保存本地,非常简单...
- 发现一个舔狗神器,Python真的太厉害了,自动下载妹子视频...
- 使用Python探索四大名著【红楼梦】人物之间的关系,简直帅呆了