如何从 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
我试图通过打印出进程名称、标识符等任何内容来弄清楚每个进程中发生了什么。
下面是一些测试代码(代码来源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