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 個核心,所以幾乎不會被注意到。
添加回答
舉報