Каков порядок возвращаемого значения функции пула starmap?

#python-3.x #multithreading #threadpool #pool

#python-3.x #многопоточность #пул потоков #Бассейн

Вопрос:

Со следующим кодом :

 def myFoo(par1,par2):  res=par1 par2  return res  inputPar=[(1,2),(2,3),(4,5)] with Pool() as pool:  poolReturn=pool.starmap(myFoo, [(i) for i in inputPar])  

могу ли я быть уверен, что индексация в poolReturn соответствует порядку вызова функции с соответствующими установленными параметрами ?

То есть :

Возврат пула[0]=3 #1 2
Возврат пула[1]=5 #2 3
Возврат пула[2]=9 #4 5

Чтобы быть уверенным, я написал этот код, который нахожу «уродливым».

 def myFoo(poolNb,par1,par2):  res=par1 par2  return {poolNb:res}  inputPar=[[1,2],[2,3],[4,5]] with Pool() as pool:  poolReturn=pool.starmap(myFoo, [[i] j for i,j in enumerate(inputPar)])  inputParamNb=1 resFromInputParamNb=poolReturn[:][inputParamNb][inputParamNb] resFromInputParamNb  

Или еще более уродливый (с ключом, который является строкой).

 def myFoo(poolNb,par1,par2):  res=par1 par2  dictKey='PoolNb_' str(poolNb)  return {dictKey:res}  inputPar=[[1,2],[2,3],[4,5]] with Pool() as pool:  poolReturn=pool.starmap(myFoo, [[i] j for i,j in enumerate(inputPar)])  inputParString='PoolNb_1' res_poolNb=[i[inputParString] for i in poolReturn if inputParString in i.keys()][0] res_poolNb  

Я полагаю, что есть лучшее решение. Любая помощь будет оценена по достоинству.

Ответ №1:

Да. Pool.starmap() — и Pool.map() — возвращает список результатов с результатами в порядке слева направо функции, применяемой к итерируемым аргументам. Таким же образом, например, встроенные map() и itertools.starmap() работают в этом отношении , хотя они возвращают генераторы , а не списки.

Единственная функция такого рода , которая не гарантирует порядок результатов Pool.imap_unordered() , — это функция, которая возвращает итерацию, которая ничего не определяет о порядке, в котором она возвращает результаты.