并行运行许多函数,并将所有结果收集到列表中

时间:2012-03-22 15:46:26

标签: python python-3.x parallel-processing

我有一个非常耗费CPU的功能:

def entity_intersections(ent, collidable):
    intersections = []

    for line1, line2 in product(ent.shape, collidable.shape):

        pair_intersections = find_intersections(line1 + ent.position, ent.velocity, ent.acceleration, line2 + collidable.position, collidable.velocity, collidable.acceleration, ent, collidable)
        intersections.extend(pair_intersections)

    return intersections

我希望对find_intersections的所有调用并行运行,以便它们执行得更快,同时仍然将所有结果收集在一起(一旦所有执行完成)。考虑到find_intersectionspure function

,我可以使用哪个库来执行此操作

非常感谢如何生成这些并行执行以及收集结果的示例。

2 个答案:

答案 0 :(得分:8)

最简单的方法是使用multiprocessing模块:

class FindIntersectionsWrapper(object):
    def __init__(self, ent, collidable):
        self.ent = ent
        self.collidable = collidable
    def __call__(self, dims):
        line1, line2 = dims
        return find_intersections(
            line1 + self.ent.position, self.ent.velocity,
            self.ent.acceleration, line2 + self.collidable.position,
            self.collidable.velocity, self.collidable.acceleration, 
            self.ent, self.collidable)

def entity_intersections(ent, collidable):
    find_inter = FindIntersectionsWrapper(ent, collidable)
    pool = multiprocessing.Pool()
    return pool.map(find_inter, product(ent.shape, collidable.shape))

辅助函数find_intersections_wrapper()是必要的,因为Pool.map()期望一个函数只有一个参数。

您可能希望将pool的创建移出entity_intersections(),以便仅产生一次生成进程池的开销。

编辑:使用类而不是闭包,因为传递给Pool.map()的可调用对象必须在Windows上可选。

答案 1 :(得分:0)