2016-11-04 49 views
2

我逃離How can I recover the return value of a function passed to multiprocessing.Process?以下解決方案:爲什麼多處理在同一個進程中運行的東西?

import multiprocessing 
from os import getpid 

def worker(procnum): 
    print('I am number %d in process %d' % (procnum, getpid())) 
    return getpid() 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes = 3) 
    print(pool.map(worker, range(5))) 

這是應該的輸出是這樣的:

I am number 0 in process 19139 
I am number 1 in process 19138 
I am number 2 in process 19140 
I am number 3 in process 19139 
I am number 4 in process 19140 
[19139, 19138, 19140, 19139, 19140] 

而是我只得到

[4212, 4212, 4212, 4212, 4212] 

如果我喂pool.map我使用了10個以上的流程,最多使用兩個不同的pid,範圍爲1,000,000。

爲什麼我的副本multiprocessing似乎在同一個過程中運行一切?

+1

你從這個例子中得到了什麼樣的例子?真正的情況是,要執行的代碼的速度非常快,以至於強迫它在多個線程之間分割工作沒有任何好處。 – Makoto

+0

在我的機器上,我相當一致地獲得了所有pid的例子,並且在10個進程中執行了100個任務。所以這似乎有些依賴於上下文。 – Mark

+1

請注意['map'方法](https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.pool.Pool.map)也有一個'chunksize'參數可以用來修復發送給子進程的塊的大小。所以你可以通過將'chunksize'設置爲更小的值來改變行爲。在任何情況下:'Pool'都是一種簡單的方式來分配任務,你不關心誰執行它們等等。它的默認設置應該可以在幾乎所有的情況下工作,所以不用擔心這直到你發現一個真正的問題與演出...... – Bakuriu

回答

2

TL; DR:任務沒有以任何方式明確分配,也許您的任務很短,它們都在其他進程開始之前完成。

從望着multiprocessing源,似乎任務只是把一個Queue,從(功能workerPool._inqueue讀取)讀取工作進程。目前還沒有計算分配,工作人員只是爭取儘可能努力工作。

那麼最有可能的賭注是,由於任務只是非常短,所以一個過程完成所有的人之前,其他人有機會看起來甚至開始。您可以通過在任務中添加兩秒鐘sleep來輕鬆檢查是否屬於這種情況。

我會注意到,在我的機器上,任務都可以非常均勻地分佈在進程上(也用於#processes> #cores)。因此,似乎有一些系統依賴性,即使所有進程在工作排隊之前都應該有.start()


下面是從worker一些修整源,其示出了任務只是從每個進程隊列中讀取,所以在僞隨機順序:

def worker(inqueue, outqueue, ...): 
    ... 
    get = inqueue.get 
    ... 
    while maxtasks is None or (maxtasks and completed < maxtasks): 
     try: 
      task = get() 
     ... 

SimpleQueue使用Pipe進程之間進行通信從SimpleQueue構造:

self._reader, self._writer = Pipe(duplex=False) 

編輯:可能關於流程啓動太慢的部分是錯誤的,所以我刪除了它。在任何工作排隊之前,所有進程都是.start() ed(可能是platform-依賴)。我無法找到當前.start()返回的過程是否已準備就緒。

+0

原來我的機器需要延遲'time.sleep(0.0005)'來獲得不同的進程。 – zelusp

+0

我的猜測是'Process'返回和您的系統上可用的進程之間存在0.0005秒的延遲,但我無法在線找到它,並且我無法在我的系統上進行測試,因爲沒有明顯的延遲。 .. – Mark

相關問題