2014-10-07 41 views
7

我希望總體上說明我們當前的通話量。我在耕種,希望瞭解當前的進展情況。因此,如果我將100作業發送到10處理器,我如何顯示當前返回的作業數量是多少。我可以得到這個ID,但是如何從我的地圖函數中算出已完成的返回作業的數量。計算執行期間在多處理執行任務中執行的任務總數

我打電話給我的功能如下:

op_list = pool.map(PPMDR_star, list(varg)) 

而在我的功能,我可以打印當前名稱

current = multiprocessing.current_process() 
print 'Running: ', current.name, current._identity 
+0

您希望能夠從每個工作進程中檢查此問題嗎? – dano 2014-10-07 14:47:47

+0

@dano - 我不介意 - 只是進程正在執行中。 Pool.map直到完成纔會返回,所以到那時爲止的任何統計信息 - 還是有辦法? – disruptive 2014-10-07 14:55:01

回答

13

如果使用pool.map_async可以拉這個信息出來的MapResult返回的實例。例如:

import multiprocessing 
import time 

def worker(i): 
    time.sleep(i) 
    return i 


if __name__ == "__main__": 
    pool = multiprocessing.Pool() 
    result = pool.map_async(worker, range(15)) 
    while not result.ready(): 
     print("num left: {}".format(result._number_left)) 
     time.sleep(1) 
    real_result = result.get() 
    pool.close() 
    pool.join() 

輸出:

num left: 15 
num left: 14 
num left: 13 
num left: 12 
num left: 11 
num left: 10 
num left: 9 
num left: 9 
num left: 8 
num left: 8 
num left: 7 
num left: 7 
num left: 6 
num left: 6 
num left: 6 
num left: 5 
num left: 5 
num left: 5 
num left: 4 
num left: 4 
num left: 4 
num left: 3 
num left: 3 
num left: 3 
num left: 2 
num left: 2 
num left: 2 
num left: 2 
num left: 1 
num left: 1 
num left: 1 
num left: 1 

multiprocessing內部打破你傳遞給map成塊的迭代,並將每個塊的子進程。因此,_number_left屬性確實保留剩餘的塊的數量,而不是可迭代中的單個元素。請記住,如果您在使用大型迭代時看到奇怪的數字。它使用分塊來提高IPC性能,但如果看到完整結果的準確記錄對您而言比添加的性能更重要,則可以使用chunksize=1關鍵字參數至map_async以使_num_left更加準確。 (chunksize通常只會對非常大的迭代產生顯着的性能差異,請親自嘗試一下,看看它是否對您的用例非常重要)。

正如你在評論中提到的,因爲pool.map阻止,你不能真正得到這個,除非你要啓動做了投票,而擋在map調用主線程在後臺線程,但我不通過上述方法確實有這樣做的好處。

要記住的另一件事是,您使用的是MapResult的內部屬性,所以有可能在未來的Python版本中可能會中斷該屬性。

+0

謝謝。我試着用map_async運行,但遇到了一個問題:'MapResult'對象不可迭代 – disruptive 2014-10-07 15:05:59

+1

@Navonod我已經更新了我的答案。您需要在MapResult實例上調用'result.get()'來獲得實際的結果列表。 – dano 2014-10-07 15:07:22

+0

我注意到一個問題似乎有很多工作要映射 - 因爲我的數字是不正確的。我派出了8k個工作 - 是很多文件,但我收到奇怪的報告。 I.e:找到#個文件8067 要處理的文件數量:253 – disruptive 2014-10-07 15:28:10