2016-02-13 97 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()