Python 多程式實踐

發表於2016-06-06

多程式的方式可以增加指令碼的併發處理能力, python 支援這種多程式的程式設計方式
在類unix系統中, python的os 模組內建了fork 函式用以建立子程式

fork 方式建立子程式

執行結果

從結果可以看到, 從pid = os.fork() 開始, 下面的部分程式碼執行了兩次, 第一次是父程式執行, 第二次是子程式執行, 且子程式的fork的結果總是0, 所以這個也可以用來作為區分父程式或是子程式標誌

那麼變數在多個程式之間是否相互影響呢
import os

執行的結果如下:

很明顯, 初始值為10的source 在父程式中值 減少了 1, 為9, 而子程式明顯source的初始值 是10, 也就是說多程式之間並沒有什麼相互影響

multiprocessing 方式建立子程式

fork 方式是僅在linux 下才有的介面, 在windows下並沒有, 那麼在windows下如何實現多程式呢, 這就用到了multiprocessing

multiprocessing 模組的Process 物件表示的是一個程式物件, 可以建立子程式並執行制定的函式

執行結果

如果沒有pro.join(), 則表示非阻塞方式執行, 那麼最終的Process end的輸出位置就有可能出現在pro_do 方法執行之前了

通過multiprocessing 的process物件建立多程式, 還可以從主程式中向子程式傳遞引數, 例如上面例子中的pro_do的引數

Pool 程式池

輸出:

其中

是立即輸出的, 後面的依次在等待了sleep的時間後輸出 , 之所以立即輸出了上面兩個是因為誒Pool 程式池預設是按照cpu的數量開啟子程式的, 我是在虛擬機器中執行, 只分配了兩核, 所以先立即啟動兩個子程式, 剩下的程式要等到前面的程式執行完成後才能啟動。
不過也可以在p=Poo() 中使用Pool(5)來指定啟動的子程式數量, 這樣輸出就是下面的了:

都是立即輸出的

程式間的通訊

父程式可以指定子程式執行的方法及其引數, 達到父程式向子程式傳遞訊息的單向通訊的目的, 那子程式之間或子程式怎麼向父程式通訊呢

Queue

Queue 是一種方式

結果

Pipe

另外還有Pipe
其原理參見http://ju.outofmemory.cn/entry/106041, 其只能作為兩個程式之間的通訊

在例項化Pipe的時候, 會產生兩個ps_pipe(read-write Connection, handle 5), pr_pipe(read-write Connection, handle 5) , 都可以作為傳送或者接受方, 一旦一個確認為, 另一個自然就是了(之所以Pipe只能作為兩個程式之間的通訊方式, 原因也許就是這個),產生的結果如下

還有一種Array, Value 的形式, 暫且不表, 有時間在折騰

以上均為python 學習筆記和練習, 如有錯誤, 歡迎指出

相關文章