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



让我们考虑一个函数f,其中包含一个要映射的参数(变化(和几个修复参数:

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

param i是固定值(如 int、float、布尔值等(,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 个程序。 这是一种手动进行多处理的方法。但是,跟踪已完成的操作和仍需计算的内容并不方便。

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

没有修复参数,我发现这种方式似乎有效:

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

使用上面的小代码,我没有使用相同的 f 函数,它仅用于测试目的。如何使用还具有固定参数的 f 函数来做到这一点?

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

蟒蛇版本:3.6

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

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

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

如果我了解你,你的问题可以改写成:

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

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)一样使用它。

相关内容

  • 没有找到相关文章

最新更新