#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()
, — это функция, которая возвращает итерацию, которая ничего не определяет о порядке, в котором она возвращает результаты.