安装依赖
pip3 install multiprocess
单个进程
单个进程其实就是只有一个主进程。程序代码在主进程的控制下顺序执行。
def f1():
for _ in range(3):
print('hello')
def f2():
for _ in range(3):
print('world')
if __name__ == "__main__":
f1()
f2()
上方代码就是一个单进程的实例。先执行函数f1
,再执行函数f2
,所以程序的最终输出结果为:
hello
hello
hello
world
world
world
多个进程
调用multiprocessing
库中的Process
或Pool
类可以在主进程的基础上创建子进程,从而实现多进程并行。
Process
from multiprocessing import Process
def f1(n):
for _ in range(n):
print('hello')
def f2(n):
for _ in range(n):
print('world')
if __name__ == "__main__":
p1 = Process(target=f1, args=(3,))
p2 = Process(target=f2, args=(3,))
p1.start()
p2.start()
上方代码就是用Process
类实现的一个多进程的实例。创建了两个子进程p1
和p2
,分别并行执行f1
和f2
函数。target
指向函数名,args
接受元组类型的输入,用于给函数传参。某次运行的输出结果如下,可以看出程序不再是顺序输出。
hello
hello
world
hello
world
world
Pool
Pool
类通过创建进程池实现多个进程的并行。一般网络爬虫都会用到进程池,比如批量下载图片或视频。
from multiprocessing import Pool
import requests
def down(url):
res = requests.get(url)
with open(url.split('/')[-1], 'wb') as f:
f.write(res.content)
if __name__ == '__main__':
urls = [
'https://i.loli.net/2020/09/22/dALSOKcGJy1alwY.jpg',
'https://i.loli.net/2020/09/22/N9UQXnzwEZi3Kbc.jpg',
'https://i.loli.net/2020/09/22/pA3r58VXws9lua6.jpg',
'https://i.loli.net/2020/09/22/G9HNuZMRzYm51tO.jpg',
'https://i.loli.net/2020/09/22/p2SKVYaGDTH1J7q.jpg',
'https://i.loli.net/2020/09/22/AHsIG1V4nBOUcdy.jpg',
'https://i.loli.net/2020/09/22/9dnLoiNfWjRpVPG.jpg',
'https://i.loli.net/2020/09/22/8eAw6maBlfrdDEn.jpg',
]
with Pool(8) as p:
p.map(down, urls)
上方代码创建了一个8进程的进程池用于批量下载url图片。Pool(8)
指定进程池的进程数是8,如果不指定,那么默认是CPU
的核心数,其实一般不用指定,默认即可。
时间分析
这里小编计算了一下下载时间。8个进程并行下载8张图片总计用时2秒多,单进程下载总计需要8~9秒。但是一般爬虫都是下载几百张,甚至几千张,这时如果设置进程池就能极大的节省下载时间。
引用参考
https://docs.python.org/zh-cn/3/library/multiprocessing.html#module-multiprocessing