如何从python的多处理池中打印出进程的进程名称

时间:2016-02-13 01:47:24

标签: python python-2.7 multiprocessing

我试图通过打印出流程名称,标识符等来弄清楚每个流程中发生了什么。

以下是一些测试代码(此代码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 个答案:

答案 0 :(得分: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 :(得分: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()