Python分享之多程式探索 (multiprocessing包)
在初步瞭解Python多程式之後,我們可以繼續探索multiprocessing包中更加好用的工具。這些工具可以讓我們更加便利地實現多程式。
程式池
程式池 (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多程式初步已經提到,我們應該儘量避免多程式共享資源。多程式共享資源必然會帶來程式間相互競爭。而這種競爭又會造成race condition,我們的結果有可能被競爭的不確定性所影響。但如果需要,我們依然可以透過共享記憶體和Manager物件這麼做。
共享記憶體
在Linux程式間通訊中,我們已經講述了共享記憶體(shared memory)的原理,這裡給出用Python實現的例子:
# modified from official documentation import multiprocessing def f(n, a): n.value = 3.14 a[0] = 5 num = multiprocessing.Value('d', 0.0) arr = multiprocessing.Array('i', range(10)) p = multiprocessing.Process(target=f, args=(num, arr)) p.start() p.join() print num.value print arr[:]
這裡我們實際上只有主程式和Process物件代表的程式。我們在主程式的記憶體空間中建立共享的記憶體,也就是Value和Array兩個物件。物件Value被設定成為雙精度數(d), 並初始化為0.0。而Array則類似於C中的陣列,有固定的型別(i, 也就是整數)。在Process程式中,我們修改了Value和Array物件。回到主程式,列印出結果,主程式也看到了兩個物件的改變,說明資源確實在兩個程式之間共享。
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就允許我們共享更多樣的物件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026630/viewspace-2991367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python分享之多程式初步 (multiprocessing包)Python
- Python多程式之分享(multiprocessing包)Python
- Python標準庫11 多程式探索 (multiprocessing包)Python
- Python併發程式設計系列之多程式(multiprocessing)Python程式設計
- Python標準庫10 多程式初步 (multiprocessing包)Python
- Python 快速教程(標準庫10):多程式初步 (multiprocessing包)Python
- Python程式專題2:multiprocessing建立程式Python
- python中socket+multiprocessing多程式Python
- [轉載] Python程式——multiprocessing.Event()|Barrier()Python
- python中的Queue與多程式(multiprocessing)Python
- Python 多程式 multiprocessing.Pool類詳解Python
- 【Python】淺談 multiprocessingPython
- 多程式Multiprocessing模組
- 【莫煩】Multiprocessing 多程式
- Python深入分享之閉包Python
- 【Multiprocessing系列】Multiprocessing基礎
- multiprocessing多程式資源共享
- python爬蟲之多執行緒、多程式+程式碼示例Python爬蟲執行緒
- python之多執行緒Python執行緒
- Python分享之數學與隨機數 (math包,random包)Python隨機random
- Python分享之路徑與檔案 (os.path包, glob包)Python
- Python標準庫分享之儲存物件 (pickle包,cPickle包)Python物件
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- python併發程式設計之多執行緒理論部分Python程式設計執行緒
- PHP回顧之多程式程式設計PHP程式設計
- 【Multiprocessing系列】Process
- Python標準庫分享之檔案管理 (部分os包,shutil包)Python
- python之多執行緒(學習)Python執行緒
- 探索 Python(5): 用 Python 程式設計 —— 控制流Python程式設計
- 探索 Python(6): 用 Python 程式設計 —— 興趣Python程式設計
- Python 多執行緒 threading和multiprocessing模組Python執行緒thread
- Python筆記二之多執行緒Python筆記執行緒
- 2788647047_init_multiprocessing
- Python爬取B站影片 抓包過程分享Python
- Python程式設計:探索有趣的程式碼設計模式Python程式設計設計模式
- 41、併發程式設計之多程式實操篇程式設計
- Python實現UDP包程式設計PythonUDP程式設計
- python自動化運維之多執行緒Python運維執行緒