我试图通过打印出流程名称,标识符等来弄清楚每个流程中发生了什么。
以下是一些测试代码(此代码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()。如何为每个流程打印出一些唯一的标识符/名称,以便我了解发生了什么?在此先感谢您的帮助。
答案 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()