进程池

Posted vivi0403

tags:

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

 
 
进程池
技术分享图片
from multiprocessing import Pool,Process
import time
def func(i):
    num =  0
    for j in range(5):
        # print(i+j)
        num += i
        return num
if __name__ == __main__:
    pool =  Pool(4)#设置池中可以有多少个子进程在运行,始终使用这几个进程去执行所有的任务
    # start_time = time.time()
    # gg  = []
    # for i in range(200):
    #     p = Process(target=func,args = (i,))  不使用地址池执行的异步的操作
    #     p.start()
    #     gg.append(p)
    # [a.join() for a in gg]
    # end_time = time.time()
    # print(end_time-start_time)
    s_time = time.time()
    a = pool.map(func,range(200))#map是异步执行的,并且自带close和join
    print(a)#map方法与内置的map函数行为基本一致,在它会使进程阻塞与此直到结果返回
    e_time  = time.time()
    print(e_time-s_time)
    # map_async(func, iterable[, chunksize[, callback]])
    # 与map用法一致,但是它是非阻塞的。与apply_async的套路基本一样
进程池的说明和pool.map的使用

 

技术分享图片
# # p.apply_async的异步执行的方法,和p.apply用法一致,但是它是非阻塞的且支持结果返回后进行回调。
from multiprocessing import Pool,Process
import time
def func(i):
    num =  0
    for j in range(5):
        num += i
    time.sleep(1)
    # return num
    print(num)
if __name__ == __main__:
    pool = Pool(5)
    for i in range(10):
        # pool.apply(func,args=(i,))#同步执行的任务机制,每次创建一个子进程,主进程都会等待子进程返回结果才,进行后面的操作
        ret = pool.apply_async(func,args=(i,)) #主循环在运行的过程中等待apply_async的返回结果,
        # 主循环运行结束后,即使子进程还没有返回,整个程序就直接结束,即使apply_async的是不阻塞的,由于apply_async的返回结果是一个结果对象
        #要通过使用ret.get() 才能获取到数据,但是.get()就具有阻塞的功能,一般是将获取到的值添加的一个新的列表中,等所有子进程都结束的时候
        #在通过遍历该该列表通过.get()的方法将结果提取

        # 解决主循环运行结束后,即使子进程还没有返回,整个程序就直接结束的问题是:
        pool.close() #锁定进程池,让一次只能执行池的大小的容量,即使有些子进程运行的速度较快,
        # 运行完之后也干等,不把位置让给其他的不是同一批次进来的子进程,
        pool.join()#作用是等待进程池的所有任务结束



# pool.close()#锁定pool ,使其不接受新的任务
# pool.terminate()#结束工作进程,不处理未处理的任务
# pool.join()#主进程阻塞等待子进程的退出,一般用在close和terminate之后

#回调函数
from multiprocessing import Pool,Process
import os
def func(i):
    print(os.getpid())
    return i*i
def gg(P):
    print(os.getpid())#证明回调函数是在主函数上运行的
    print(P)
if __name__ == __main__:
    pool = Pool(4)
    pool.apply_async(func,args=(3,),callback=gg)#callback函数不能直接传参,只能通过接收前一个函数的返回值
    print(os.getpid())
    pool.close()
    pool.join()
apply与apply_async的使用说明

 

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

多线程编程

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

python进程进程池代码部分

线程池

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

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