2013-10-06 31 views
1

下面的代碼是非常簡單的,只用於測試目的,但我沒有得到所期望的輸出:鎖定在多包不工作

from multiprocessing import Process,Lock 

def printing(l,i): 
    l.acquire() 
    print i 
    l.release() 

if __name__ == '__main__': 
    lock = Lock() 

    for i in range(10): 
     Process(target=printing,args=(lock,i)).start() 

輸出是:

0 
1 
2 
3 
5 
6 
4 
7 
8 
9 

鎖應該暫停執行其他進程。爲什麼不在這裏發生?

回答

2

你期望輸出什麼?輸出對我來說很好:range(10)的排列組合。其中進程恰好執行的訂單可能因運行而異。這是預期的。

我懷疑你誤解了鎖的功能。當你獲得一個鎖時,每個其他進程也試圖獲得相同的鎖,直到鎖被釋放。就這樣。在你的測試運行中,進程0碰巧首先獲取鎖。任何其他正在嘗試獲取該鎖的進程都會被阻止,直到進程0釋放鎖。進程0打印0,然後釋放該鎖。然後恰巧第一個過程獲得了鎖定。等等

註釋掉你的l.release(),你會看到你的程序永遠不會結束:第一個獲得鎖的進程然後打印它的整數,並且所有其他進程永遠被阻塞,等待獲得鎖。

+0

我現在明白了鎖的功能。謝謝你。 那麼我們如何控制進程的順序呢? – Arko

+0

您應該爲此打開一個新問題。多處理的**點**是並行執行進程,而不是一次執行一個進程。如果你想一次只做一個,那就開始一個過程,等待它完成,然後開始另一個過程 - 等等。 –