如果使用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版本中可能會中斷該屬性。
您希望能夠從每個工作進程中檢查此問題嗎? – dano 2014-10-07 14:47:47
@dano - 我不介意 - 只是進程正在執行中。 Pool.map直到完成纔會返回,所以到那時爲止的任何統計信息 - 還是有辦法? – disruptive 2014-10-07 14:55:01