从pool.starmap_async获取结果

时间:2019-06-05 06:36:21

标签: python asynchronous multiprocessing starmap

我有一个程序,它计算array * value的索引并返回str。我使用starmap_async方法,因为必须将两个参数传递给异步函数。该程序如下所示:

import multiprocessing as mp
from multiprocessing import freeze_support

def go_async(self, index, value) :
        return str(index * int(value))

def log_result(self, result):
        print("Succesfully get callback! With result: ", result)

def main() :
    array = [1,3,4,5,6,7]
    pool = mp.Pool() 
    res = pool.starmap_async(go_async, enumerate(array), callback = log_result)        
    print("Final result: ", res)
    pool.close()
    pool.join()

if __name__ == '__main__':    
    freeze_support()
    main()

我想得到一个结果为str的数组:

res = ['0', '3', '8', '15', '24', '35']

但我只有结果:

  

最终结果:位于处的multiprocessing.pool.MapResult对象   0x000001F7C10E51D0

如何正确地从starmap_async获取价值? 而且,回复时间不会增加。

1 个答案:

答案 0 :(得分:1)

池的异步方法返回的对象在概念上是"explicit futures",您需要调用.get()来等待并接收实际结果。 因此res.get()将给您您的结果。您还需要从函数中删除self,因为您不会在starmap调用中传递实例。当前,这会导致目标函数中出现异常,这也是您的回调不触发的原因。