Python多进程Pool进程池的使用
1、打开Python开发工具IDLE,新建‘poll.py’文件,写代码如下:
from multiprocessing import Pool
def fun(x):
return x*2
if __name__ == '__main__':
p = Pool(5) #如果参数为空,默认为os.cpu_count()
print(p.map(fun, [1, 2, 3]))
注意这里一定要写if __name__ == '__main__':在多进程程序里,必须指明主进程

2、F5运行程序,很快打印出列表每项乘以2后的结果,[2, 4, 6] 这个计算的速度肯定比不用多进程快,尤其数据很大的时候,这里就不去测试。

3、还有另外一种方法,也能实现同样的功能,改写‘pool.py’代码如下:
from multiprocessing import Pool
def fun(x):
return x*2
if __name__=='__main__':
p = Pool(5)
list1=[]
for i in range(5):
print (i)
res = p.apply_async(fun,[i,])
list1.append(res)
for j in list1:
print (j.get())
这个看起来更好理解一点,apply_async(fun,[i,])是创建异步进程的方法,进程创建后立即执行,get()用于获取内容,注意不能再第一个循环里用,不然会等待进程get返回值阻塞主进程的继续执行。

4、F5运行程序,很快打印出每项乘以2后的结果:
0
1
2
3
4
0
2
4
6
8

5、如果需要等待所有进程结束再继续执行主进程,需要改写代码如下:
from multiprocessing import Pool
def fun(x):
return x*2
if __name__=='__main__':
p = Pool(5)
list1=[]
for i in range(5):
print (i)
res = p.apply_async(fun,[i,])
list1.append(res)
p.close()
p.join()
print('进程池创建的进程已结束')
for j in list1:
print (j.get())
p.close(),只是不允许再使用进程池创建新进程,必须在p.join()前

6、F5运行程序,很快打印出进程池创建进程结束的消息以及每项乘以2后的结果:
0
1
2
3
4
进程池创建的进程已结束
0
2
4
6
8
