首页 > 解决方案 > 如何使用 f(var, param1, param2, ...) 正确使用多处理

问题描述

让我们考虑一个函数 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 函数来做到这一点?

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

蟒蛇版本:3.6

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

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

多处理也可以做到这一点吗?

标签: pythonmultithreadingmultiprocessing

解决方案


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

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

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


推荐阅读