Этот 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()
необходимо, кроме как путем экспериментов.