Python學習-八周二次課(12月12日)
八周二次課(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日)