如何使用f(var,param1,param2,...)进行正确的多处理

时间:2018-05-03 09:26:39

标签: python multithreading multiprocessing

让我们考虑一个带有一个参数的函数f来映射(变化)和几个修复参数:

f(var, param1, param2, param3, param4)

param i是固定值(如int,float,booleans,...),var参数是对象列表。

目前的做法:

p1 = 0
p2 = 200
var = [[Object(x, p1, p2), Object(y, p1, p2), Object(z, p1, p2 = test = True)] for x in range(5) for y in range(10) for z in range(25)]

for v in var:
    f(v, param1, param2, param3, param4)

由于var的一个元素的计算不依赖于其他元素,我实际上切片列表var并用N个不同的切片启动程序N次,因此我运行了N个程序我的电脑的N核心。 这是一种进行多处理的手动方式。但是,跟踪已完成的内容和仍有待计算的内容并不十分方便。

我想直接在程序中实现多线程/多处理。

如果没有fix参数,我发现这种方式似乎有效:

from multiprocessing import Pool

p = Pool(processes = 16) # 16 cores.
p.map(f, var)
p.terminate()

使用上面的小代码,我没有使用相同的f函数,它仅用于测试目的。如何使用我的f函数来修复参数呢?

最好的方法是什么?谢谢!

python的版本:3.6

编辑: 我还想跟踪进展情况。目前,我的代码是:

for i,v in enumerate(var):
    print ("{} / {}".format(i, len(var))
    f(v, param1, param2, param3, param4)

这可以通过多处理完成吗?

1 个答案:

答案 0 :(得分:1)

如果我理解你,你的问题可以重写为:

如何使用多处理轻松映射具有多个固定参数的函数?

类似于p.starmap(f, [(v, fix1, fix2, fix3) for v in dynamics])

我认为你可以包装你的f功能。

例如:

def fixed_para_wrapper(dynamic):
    return f(dynamic, fix1, fix2, fix3)

然后您可以像p.map(fixed_para_wrapper, dynamics)一样使用它。