Я использую multiprocessing.Pool в Python 3.6 через Spyder 3.6.5 на компьютере с Windows 10. Цель состоит в том, чтобы получить выходные данные простой квадратичной функции путем импорта нескольких входных данных (в этом примере для практических целей включены только 4 значения). Код ниже работает нормально:
import numpy as np
import multiprocessing
from multiprocessing import Pool
data=[]
data.append(np.array([1,2]))
data.append(np.array([4,5]))
Output=np.zeros((2,2))
for i in range (0,2):
data1=data[i]
def square(x):
return x*x
if __name__ == '__main__':
__spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)"
with Pool(multiprocessing.cpu_count()) as p:
output = p.map(square, data1, chunksize=10)
p.close()
output=np.asarray(output)
Output[i]=output
в то время как в случае, когда я хочу указать значения входной квадратной функции (x) как:
def square(ii):
x=data1[ii]
return x*x
цикл for выполняется два раза (из-за «для i в диапазоне (0,2)»), но результаты p.map одинаковы при каждом запуске и равны второму запуску, т.е. вместо того, чтобы быть Output=np.array ([[1,4],[16,25]]) Я получаю Output=np.array([[16,25],[16,25]]). Кажется, что цикл for выполняется два раза с i=1, а не как в первом цикле i=0 и во втором i=1.
Любые идеи о том, что я делаю неправильно?
data=[] data.append(np.array([1,2])) data.append(np.array([4,5])) Output=np.zeros((2,2)) for i in range (0,2): data1=data[i] def square(ii): x=data1[ii] return x*x if __name__ == '__main__': __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" with Pool(multiprocessing.cpu_count()) as p: output = p.map(square, range(2), chunksize=10) p.close() p.join() output=np.asarray(output) Output[i]=output
02.07.2018