Python многопроцессорная обработка - starmap_asyn c не работает там, где работает starmap? - PullRequest
1 голос
/ 27 января 2020

Этот starmap пример программы работает, как и предполагалось:

import multiprocessing

def main():
    pool = multiprocessing.Pool(10)
    params = [ (2, 2), (4, 4), (6, 6) ]
    pool.starmap(printSum, params)
# end function

def printSum(num1, num2):
    print('in printSum')
    mySum = num1 + num2
    print('num1 = ' + str(num1) + ', num2 = ' + str(num2) + ', sum = ' + str(mySum))
# end function

if __name__ == '__main__':
    main()

вывод:

in printSum
num1 = 2, num2 = 2, sum = 4
in printSum
num1 = 4, num2 = 4, sum = 8
in printSum
num1 = 6, num2 = 6, sum = 12

Но если я изменю строку starmap на starmap_async следующим образом:

pool.starmap_async(printSum, params)

и все остальное так же, я ничего не получаю!?!? Из чтения документов https://docs.python.org/3/library/multiprocessing.html#multiprocessing .pool.Pool.map_asyn c Я не могу определить причину этого. Я успешно использовал starmap_asyn c в других ситуациях. Что мне здесь не хватает ??

--- Редактировать ---

Я обнаружил, что если в приведенной выше рабочей программе я изменяю строку

pool.starmap(printSum, params)

на следующие две строки:

result = pool.starmap_async(printSum, params)
result.get()

Затем я получаю ожидаемый результат, поэтому я полагаю, что это по крайней мере решает проблему. Но может кто-нибудь объяснить, почему .get() не требуется для не async версии map / starmap, а .get() необходимо для async версий ?? Действительно сбивает с толку то, что для версий async в некоторых случаях .get() необходим (как указано выше), но в других случаях с async версией .get() нет необходимости, и я не могу определить, как и почему / когда .get() необходимо, кроме как путем экспериментов.

1 Ответ

1 голос
/ 27 января 2020

Вы не ожидаете результата от будущего , полученного при вызове .starmap_async(), или делаете что-либо еще, что помешает выходу MainProcess сразу после планирования задания.

pool.starmap_async(printSum, params).wait() сделал бы это, но здесь это бессмысленно. Варианты asyn c имеют смысл, только если вам нужно, чтобы вызывающий поток был разблокирован, чтобы сделать что-то еще в это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...