我有一个非常耗费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_intersections
是pure function?
非常感谢如何生成这些并行执行以及收集结果的示例。
答案 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)
您应该使用threading
类
http://docs.python.org/library/threading.html#module-threading
这个页面有一些很好的例子: http://www.tutorialspoint.com/python/python_multithreading.htm