1. 程式人生 > >Python學習-八周二次課(12月12日)

Python學習-八周二次課(12月12日)

實現 thread 而不是 imp 完全 多進程 模仿 res har

八周二次課(12月12日)
14.6 多進程Manager
14.7 進程池

Manager

Manager對象類似於服務器與客戶之間的通信 (server-client),與我們在Internet上的活動很類似。我們用一個進程作為服務器,建立Manager來真正存放資源。其它的進程可以通過參數傳遞或者根據地址來訪問Manager,建立連接後,操作服務器上的資源。在防火墻允許的情況下,我們完全可以將Manager運用於多計算機,從而模仿了一個真實的網絡情境。下面的例子中,我們對Manager的使用類似於shared memory,但可以共享更豐富的對象類型。

技術分享圖片
import multiprocessing

def f(x, arr, l):
    x.value = 3.14
    arr[0] = 5
    l.append(‘Hello‘)

server = multiprocessing.Manager()
x    = server.Value(‘d‘, 0.0)
arr  = server.Array(‘i‘, range(10))
l    = server.list()

proc = multiprocessing.Process(target=f, args=(x, arr, l))
proc.start()
proc.join()

print(x.value)
print(arr)
print(l)
技術分享圖片

Manager利用list()方法提供了表的共享方式。實際上你可以利用dict()來共享詞典,Lock()來共享threading.Lock(註意,我們共享的是threading.Lock,而不是進程的mutiprocessing.Lock。後者本身已經實現了進程共享)等。 這樣Manager就允許我們共享更多樣的對象

進程池 (Process Pool)可以創建多個進程。

比如下面的程序:

技術分享圖片
import multiprocessing as mul

def f(x):
    return x**2

pool = mul.Pool(5)
rel  = pool.map(f,[1,2,3,4,5,6,7,8,9,10])
print(rel)
技術分享圖片

我們創建了一個容許5個進程的進程池 (Process Pool) 。Pool運行的每個進程都執行f()函數。我們利用map()方法,將f()函數作用到表的每個元素上。這與built-in的map()函數類似,只是這裏用5個進程並行處理。如果進程運行結束後,還有需要處理的元素,那麽的進程會被用於重新運行f()函數。除了map()方法外,Pool還有下面的常用方法。

apply_async(func,args) 從進程池中取出一個進程執行func,args為func的參數。它將返回一個AsyncResult的對象,你可以對該對象調用get()方法以獲得結果。

close() 進程池不再創建新的進程

join() wait進程池中的全部進程。必須對Pool先調用close()方法才能join。

Python學習-八周二次課(12月12日)