2 回答
TA贡献1784条经验 获得超2个赞
让我们用一个真实的例子来具体说明这一点:
import multiprocessing as mp
def calc_func(x):
return x * x
class Foo:
def __init__(self):
self.pool = mp.Pool(mp.cpu_count())
def do_parallel_calculations(self, values):
results = []
for value in values:
results.append(self.pool.apply_async(calc_func, args=(value,)))
for result in results:
print(result.get())
if __name__ == '__main__':
foo = Foo()
foo.do_parallel_calculations([1,2,3])
TA贡献1829条经验 获得超7个赞
我想我设法通过在 apply_async() 返回的 AsyncResult 对象上调用 get() 来做到这一点。所以代码就变成了:
def do_parallel_calculations(self, ...):
results = []
for _ in range(mp.cpu_count()):
results.append(self.pool.apply_async(calc_func, args=(...)))
aggregated_result = 0
for result in results:
aggregated_result += result.get()
其中 calc_func() 返回单个任务结果,不需要回调和全局变量。
这并不理想,因为我以任意顺序等待它们,而不是按照它们实际完成的顺序(最有效的方法是减少结果),但由于我只有 4 个核心,所以几乎不会被注意到。
添加回答
举报