Получить результат из pool.starmap_async - PullRequest
1 голос
/ 05 июня 2019

У меня есть программа, которая вычисляет индекс массива * значение и возвращает 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 Ответ

1 голос
/ 05 июня 2019

Асинхронные методы пула возвращают объекты, которые концептуально "явные фьючерсы" , вам нужно вызвать .get(), чтобы дождаться и получить фактический результат.Так что res.get() даст вам ваш результат.Вам также необходимо удалить self из ваших функций, поскольку вы не передаете экземпляр по вызову starmap.В настоящее время это приводит к исключению в вашей целевой функции, и это также причина, по которой ваш обратный вызов не срабатывает.

...