进程池

Posted youhongliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程池相关的知识,希望对你有一定的参考价值。

一、为什么要有进程池

   开启过多的进程并不能提高你的效率,反而会降低效率。

1.1 计算密集型

   充分占用CPU 多进程可以充分利用多核。适合开启多进程,但是不适合开启很多多进程。

1.2 IO密集型

   大部分时间都在阻塞对列中,而不是在运行状态中

   根本不太适合开启多进程

简单进程池的代码实现 ---->异步提交

from multiprocessing import Pool
def func(num):
    print(做了第%s间衣服%num)
if __name__ == __main__:
    p = Pool(4)
    for i in range(10):
         p.apply_async(func,args=(i,))  # 异步提交func到一个子进程中执行
    p.close()       # 关闭进程池,用户不能再向这个池中提交任务了
    p.join()           # 阻塞,直到进程池中所有的任务都被执行完

简单进程池的代码实现 ---->同步提交

from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool(4)
    for i in range(20):
        res = p.apply(task,args=(i,))  # 提交任务的方法 同步提交
        print(-->,res)    # 同步提交,有返回值

进程池---->异步提交,有返回值   # 通过 get()方法实现

from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool()
    res_lst = []
    for i in range(20):
        res = p.apply_async(task,args=(i,))  # 提交任务的方法 异步 提交
        res_lst.append(res)   # 对象(编号)
    for res in res_lst:
        print(-->,res.get())
实例化 传参数 进程的个数 cpu/cpu + 1
提交任务
同步提交 apply
返回值:子进程对应函数的返回值
一个一个顺序执行的,并没有任何并发效果
异步提交 apply_async
没有返回值,要想所有任务能够顺利的执行完毕
p.close()
p,join() # 必须先close再join,阻塞直到进程池中的所有任务都执行完毕
有返回值的情况下
res.get() # get不能再提交任务之后立刻执行,应该是先提交所有的任务再通过get获取结果
map()方法
import os
import time
from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool()
    p.map(task,range(20))
map()方法
异步提交的简化版本
自带close和join方法













以上是关于进程池的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python进程进程池代码部分

线程池

IIS6 程序池错误< 'DefaultAppPool' 提供服务的进程意外终止>

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程