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

How to print out the process name of a process from python's multiprocessing pool

我试图通过打印出进程名称、标识符等任何内容来弄清楚每个进程中发生了什么。

下面是一些测试代码(代码来源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]

我想 want/need 帮助我调试我的程序有什么问题。但是,我的代码略有不同(我需要从其他人那里修复遗留代码)。我下面的代码没有打印漂亮的 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()。如何为每个进程打印出一些独特的 identifier/name 以便我深入了解正在发生的事情?预先感谢您的帮助。

试试看:

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()

注意 - 打开太多并行进程时要小心。 apply_sync 很有用,但您必须设置要打开的并行进程的最大限制。默认为 None。同样重要的是要注意,如果任何池工作人员空闲,那么将使用它。因此,让 f(x) 休息一下,以确保在创建所有并行进程之前,其中 none 个应该是空闲的。

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