1. 程式人生 > >38. Python 多進程Manager 進程池

38. Python 多進程Manager 進程池

python manager 進程池

強大的Manager模塊

上一節實現的數據共享的方式只有兩種結構Value和Array。

Python中提供了強大的Manager模塊,專門用來做數據共享。

他支持的類型非常多,包括:Value、Araay、list、dict、Queue、Lock等。

以下例子:

import multiprocessing
def worker(d,l):
    l += range(11, 16)
    for i in xrange(1, 6):
        key = "key{0}".format(i)
        val = "val{0}".format(i)
        d[key] = val

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()
    l = manager.list()
    p = multiprocessing.Process(target=worker, args=(d, l))
    p.start()
    p.join()
    print(d)
    print(l)

打印結果:

{'key3': 'val3', 'key2': 'val2', 'key1': 'val1', 'key5': 'val5', 'key4': 'val4'}
[11, 12, 13, 14, 15]



進程池:

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__":
    pool = multiprocessing.Pool(processes=3)
    for i in xrange(1, 10):
        msg = "hello{0}".format(i)
        pool.apply_async(func=worker, args=(msg,))
    pool.close()
    pool.join()     #調用join之前,先調用close函數,否則會出錯。執行完close後不會有新的進程加入到pool,join函數等待所有子進程結束
    print ("main end")

打印結果:

#######start hello1########
#######start hello2########
#######start hello3########
#######end   hello1########
#######start hello4########
#######end   hello2########
#######start hello5########
#######end   hello3########
#######start hello6########
#######end   hello4########
#######start hello7########
#######end   hello5########
#######start hello8########
#######end   hello6########
#######start hello9########
#######end   hello7########
#######end   hello8########
#######end   hello9########
main end



阻塞:

import multiprocessing
import time
def worker(msg):
    print ("#######start {0}########".format(msg))
    time.sleep(1)
    print ("#######end   {0}########".format(msg))
    
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=3)
    for i in xrange(1, 10):
        msg = "hello{0}".format(i)
        pool.apply(func=worker, args=(msg,))
    pool.close()
    pool.join()     #調用join之前,先調用close函數,否則會出錯。執行完close後不會有新的進程加入到pool,join函數等待所有子進程結束
    print ("main end")

打印結果:

#######start hello1########
#######end   hello1########
#######start hello2########
#######end   hello2########
#######start hello3########
#######end   hello3########
#######start hello4########
#######end   hello4########
#######start hello5########
#######end   hello5########
#######start hello6########
#######end   hello6########
#######start hello7########
#######end   hello7########
#######start hello8########
#######end   hello8########
#######start hello9########
#######end   hello9########
main end


對比一下兩種類型的輸出狀態即可明白。

38. Python 多進程Manager 進程池