2013-02-27 159 views
2

當我從Python的多模塊page運行下面的代碼:同步問題

from multiprocessing import Process, Lock 

def f(l, i): 
    l.acquire() 
    print 'hello world', i 
    l.release() 

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

    for num in range(10): 
     Process(target=f, args=(lock, num)).start() 

有時候我無序的輸出,如:

hello world 0 
hello world 1 
hello world 2 
hello world 4 
hello world 3 
hello world 6 
hello world 5 
hello world 7 
hello world 8 
hello world 9 

需要注意的是4前打印3和6印在5之前。爲什麼?

+4

一行10人在一個房間裏,然後當你大喊「走」時,他們都必須穿過和走出單門。他們以什麼順序離開? – 2013-02-27 20:41:24

+0

如果您希望進程順序運行,請勿使用'multiprocessing'。您可以使用正確的同步原語強制進行順序計算,但是爲什麼?只需在一個過程中一個接一個地運行它們。另一方面,如果你只是想按順序獲得_results_,那就很有道理,並且有辦法做到這一點(如果你可以使用一個池而不是一個單獨的進程,每個任務都是微不足道的;不平凡但仍然非常簡單如果你不能)。 – abarnert 2013-02-27 20:59:12

回答

3

因爲multiprocessing的整點是並行。您的流程正在彼此同時運行,因此它們可能會以任何順序開始和結束。

鎖定採集只能確保他們不會嘗試print在同一時間 - 但該鎖定可以通過各種進程以任意隨機順序獲取。更多可能被您創建的第一個進程獲得,因爲該進程將盡快完成其初始化,因此可能是第一個請求鎖定。但是沒有訂單的保證。

+0

感謝Amber,但是他們的意思是「不使用來自不同進程的鎖輸出可能會讓所有混淆。」在他們的頁面? – polerto 2013-02-27 20:41:56

+2

@polerto不要在你的'f'函數中放置1個'print'語句,試着放3個。你會注意到沒有鎖定,有時單個數字會混淆起來(例如'1,1,2,1,2 ,2'),而對於鎖,數字的順序可能會混在一起,但是相同的數字總會在一起(例如'2,2,2,1,1,1')。 – Amber 2013-02-27 20:43:25

1

這取決於操作系統如何計劃首先運行哪一個,並且鎖只能防止它們中的多個運行在同一時間。