Python网编_进程池

如果我们有多少个任务就开启多少个进程,实际上是很浪费资源的。
由于我们计算机的CPU个数是有限的,
所以我们起的进程数量时完全和CPU个数相关。
进程池的概念:鱼池是放鱼的,水池是放水的,奖金池是放奖金的,顾名思义进程池就是放进程的。
我们想象,先创建叫进程池容器,然后制作四个进程放到这个进程池里,当有任务需要进程去处理的时候,
从进程池中调动一个进程去干活,干完活了进程再回到进程池中,因此我们节省了反复创建进程所消耗的时间和资源
from multiprocessing import Pool  # 导入池子模块 使用进程池开进程是不需要Process的
import os,time


def func(i):
    time.sleep(0.1)
    print(i,os.getpid())


if __name__ == '__main__':

    p = Pool(4)  # 实例化一个4进程的进程池
    for i in range(10):
        p.apply_async(func,args=(i,))  # 异步的提交任务
    p.close()  # 关闭池子,这里不是回收池子中的进程,而是阻止继续提交任务
    p.join()  # 阻塞,直到池子中的任务都执行完毕

"""
执行结果:
0 14928
1 12132
2 14976
3 15084
4 14928  # 每四个一重复,说明一共有四个进程在工作
5 12132
6 14976
7 15084
8 14928
9 12132
"""

进程池会比普通的多进程节省效率,开启池是一个合理的且相对高效操作。当然进程池中的进程数要结合运行电脑的性能及及程序情况综合考虑,绝对不是越多越好。一般我们开启CPU个数或者CPU个数加1。

不是所有的情况都适合使用多进程来解决,比如群聊,起多进程是很消耗资源的。一般高计算的程序适合使用多进程

 

起多进程的意义:

  1·为了更好的利用CPU,所以如果我们的程序中都是网络I/O或者是文件I/O,就不适合起多进程。

  2·起多进程是为了数据的隔离,如果程序中总是要用到数据共享,那么就不适合使用多进程。

  3·超过了CPU个数的任务数,都应该使用进程池来解决问题,而不是无限的开启子进程。

 

进程池的其他机制:

使用map简化代码
if __name__ == '__main__':
    p = Pool(4)
    p.map(func,range(10))     
"""
等同于:
if __name__ == '__main__':

    p = Pool(4)
    for i in range(10):
        p.apply_async(func,args=(i,))  # 异步的提交任务
    p.close()  # 关闭池子,这里不是回收池子中的进程,而是阻止继续提交任务
    p.join()  # 阻塞,直到池子中的任务都执行完毕
"""

 

异步提交任务是可以有返回值的,如果func有返回值,那么ret.get()是可以获取函数返回值的
ret = p.apply_async(func, args=(i,))
print(ret.get())

 同样的使用p.map()也是可以拿到返回值的

ret = p.map(func,range(10))
for r in ret:
    print(r)

 

猜你喜欢

转载自www.cnblogs.com/gzying-01/p/10375704.html
0条评论
添加一条新回复