欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python下的manage和进程池实例讲解

程序员文章站 2022-06-22 13:45:56
Manage 以上实现的数据共享的方式只有两种结构Value和Array。Python中提供了强大的Manage专门用来做数据共享的,其支持的类型非常多,包括,Value, Ar...
Manage

以上实现的数据共享的方式只有两种结构Value和Array。Python中提供了强大的Manage专门用来做数据共享的,其支持的类型非常多,包括,Value, Array,list,dict, Queue, Lock等。

示例:

import multiprocessing

def worker(dic,list):
    list += range(11,16)
    for i in xrange(1,6):
        key  ="key{0}".format(i)
        val = "val{0}".format(i)
        dic[key]=val
 #   print "##"
if __name__ =='__main__':
    mamager=multiprocessing.Manager()
    d=mamager.dict()
    l=mamager.list()
    p=multiprocessing.Process(target=worker,args=(d,l))
    p.start()
    p.join()
    print (d)
    print (l)
    print ("main end")

结果:

{‘key3’: ‘val3’, ‘key2’: ‘val2’, ‘key1’: ‘val1’, ‘key5’: ‘val5’, ‘key4’: ‘val4’}

[11, 12, 13, 14, 15]

main end

进程池

Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程。

阻塞和非阻塞的区别:

Pool.apply_async 非阻塞,定义的进程池进程最大数可以同时执行。

Pool.apply 一个进程结束,释放回进程池,下一个进程才可以开始

import multiprocessing
import time
def worker(msg):
    print ("####start {0}####").format(msg)
    time.sleep(1)
    print ("####end {0}#####").format(msg)

if __name__ =="__main__":
    print ("main start ")
    pool =multiprocessing.Pool(processes=3)
    for i in xrange(1,6):
        msg = "hello {0}".format(i)
        pool.apply_async(func=worker,args=(msg,))
    pool.close()
    pool.join()
    print("main end")

结果:

main start

start hello 1

start hello 2

start hello 3

end hello 1

start hello 4

end hello 3#########end hello 2

start hello 5

end hello 4

end hello 5

main end