2016-02-13 99 views
1

我想通過打印出進程名稱,標識符和任何東西來弄清楚每個進程中發生了什麼。如何從python的多處理池中打印進程的進程名稱

下面是一些測試代碼(代碼信貸這個SO question :)

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    print p.map(f, range(6)) 

def main(): 
    b() 

它產生的輸出:

PoolWorker-6 
PoolWorker-10 
PoolWorker-10 
PoolWorker-11 
PoolWorker-14 
PoolWorker-15 
[0, 1, 4, 9, 16, 25] 

這是我想,我想/需要幫我調試我的程序有什麼問題。但是,我的代碼稍有不同(我需要從其他人修復舊代碼)。我在下面的代碼不打印漂亮的PoolWorker ID。

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    for i in range(10): 
     p.apply_async(f(i)) 

def main(): 
    b() 

當我運行這段代碼,它打印出:

MainProcess 
MainProcess 
MainProcess 
MainProcess 
MainProcess 
MainProcess 

所以我的代碼使用Pool.apply_sync()而不是Pool.map()。如何爲每個流程打印出一些獨特的標識符/名稱,以便我瞭解發生了什麼?在此先感謝您的幫助。

+2

這是因爲你在父進程中調用'f(i)'而不發送給每個worker。 – univerio

回答

2

注 - 要小心,同時打開太多的並行處理。 apply_sync很有用,但您必須設置要打開的並行進程的最大限制。默認情況下它是無。同樣重要的是要注意,如果任何泳池工作人員都是免費的,那麼就可以使用。因此,在f(x)中進行一些睡眠以確保在創建所有並行進程之前,它們都不應該空閒。

import multiprocessing 
import time 
def f(x): 
    print multiprocessing.current_process().name 
    time.sleep(4) 
    return x * x 

def b(): 
    p = multiprocessing.Pool(processes=4) 
    for i in range(4): 
     p.apply_async(f, args=(i,)) 
    p.close() 
    p.join() 
b() 

PoolWorker-1 
PoolWorker-3 
PoolWorker-2 
PoolWorker-4 
1

試一下:

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    for i in range(10): 
     p.apply_async(f, args=(i,)) 
    p.close() 
    p.join() 


def main(): 
    b()