【问题标题】:How to print out the process name of a process from python's multiprocessing pool如何从python的多处理池中打印出进程的进程名称
【发布时间】:2016-02-13 01:47:24
【问题描述】:

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

下面是一些测试代码(代码归功于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()。如何为每个进程打印出一些唯一标识符/名称,以便我了解正在发生的事情?提前感谢您的帮助。

【问题讨论】:

  • 那是因为你在父进程中调用了f(i) 而没有发送给每个worker。

标签: python python-2.7 multiprocessing


【解决方案1】:

注意 - 打开太多并行进程时要小心。 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

【讨论】:

    【解决方案2】:

    试试看:

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

    【讨论】:

      最近更新 更多