一、进程池概念
1、概念:
进程池是资源进程、管理进程组成的技术的应用。
2、进程池组成:
1)、资源进程:
预先创建好的空闲进程,管理进程会把工作分发到空闲进程来处理;
2)、管理进程:
管理进程负责创建资源进程,把工作交给空闲资源进程处理,回收已近处理完工作
的资源进程。
1>、进程池的关键点:
管理进程如何有效的管理资源进程,分配任务给资源进程,回收空闲资源进程,
管理进程要有效的管理资源进程,那么管理进程跟资源进程必然需要交互。
2>、交互方式:
IPC 信号 信号量 消息队列 管道等进行交互
二、进程池特征
1、默认开启的进程池数是CPU核数
2、进程池有同步异步问题
三、进程池创建
1、apply_async()异步提交任务:
from multiprocessing import Process,Pool
def func(i):
i+=1
return i#普通进程处理过的数据返回给主进程p1
def call_back(p1):
p1+=1
print(p1)
if __name__ == '__main__':
p = Pool()
for i in range(10):
p1 = p.apply_async(func,args=(i,),callback = call_back)#p调用普通进程并且接受其返回值,将返回值给要执行的回调函数处理
p.close()
p.join()
2、apply()同步提交任务:
from multiprocessing import Pool
import time
def func(num):
num += 1
return num
if __name__ == '__main__':
p = Pool(5)
start = time.time()
for i in range(10000):
res = p.apply(func,args=(i,))# 同步处理这100个任务,同步是指,哪怕我进程中有5个进程,也依旧是1个进程1个进程的去执行任务
# time.sleep(0.5)
print(res)
print(time.time() - start)
四、论述进程池同步异步问题
1、apply_async()异步提交:
异步提交的特点:全异步,主进程和子进程都异步了,当主进程代码结束后,程序就
结束啦,进程池里面的子进程全部被回收了。 异步的效率,也就是池中的进程一次性都去执行任务.
所以要用到join方法:阻塞直到进程池中的所有任务都执行完毕;
在没有返回值的情况下,要想所有任务都能顺利执行完毕,就要用pool.close(),pool.join(),r.get();
pool.close():停止添加任务
pool.join():等待子进程结束
get()方法不能在提交任务之后立刻执行。应该是先提交所有任务在通过get()取返回值
2、apply()同步提交:
apply()方法提供了返回值:子进程对应函数的返回值。
弊端:一个一个顺序执行,没有任何并发效果。哪怕我进程中有5个进程,也依旧是1个进程1个进程的去执行任务
五、程序的两种类型计算型与IO型了解
1、计算型:
适合开启多进程,但是不适合开启很多进程。
因为计算型能充分占用CPU,适合使用多进程,因为多进程能充分利用多核。
2、IO型:
不适合开启多进程:因为开启多进程的目的是为了充分利用多核。IO型大部分时间
都在等,所以一个CPU轮流执行就够了,因为大部分时间都在阻塞队列里,而不是在运行状态中,
如socket程序,爬虫,文件操作等耗时操作。