Я пытаюсь выяснить, обращаются ли рабочие к списку объектов, которые я включаю в свое понимание списка, итеративное для функции pool.map, непосредственно или работники получают копии списков.
Я использую DEAP и успешно внедрил многопроцессорность. Первоначально я считывал файлы CSV в массивы и отправлял массивы работникам, но тогда каждому работнику приходилось создавать собственный список объектов. Я подумал, что если я смогу создать объекты один раз и отправить их копии, это может ускорить процесс.
Похоже, что он работает одинаково в обоих направлениях, за исключением небольшого ускорения создания списков объектов в основном контексте. Я хочу убедиться, что работники не изменяют одни и те же объекты списка.
Я создаю списки, читая данные из файлов CSV и добавляя объекты в мои списки, определенные в основном контексте.
Пример:
if __name__ == '__main__':
start_time = time.time()
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
toolbox.register("map", pool.map)
_jobsArray = []
with open('.\Datasets\Jobs.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
next(readCSV) # Skip the header
for row in readCSV:
Job(row[0], literal_eval(row[1]), literal_eval(row[3]), literal_eval(row[2]), literal_eval(row[4])))
Позже я использую понимание списка для создания необходимой итерации:
fitnesses = toolbox.map(toolbox.evaluate, [(indiv, _jobsArray, _machinesArray) for indiv in invalid_ind])
Затем я распаковываю кортеж в своей функции оценки и использую объекты.
Я использовал распечатки на разных этапах, чтобы попытаться определить состояния списков. На основании печати сразу после распаковки кортежа, списки находятся в их состоянии по умолчанию в начале оценки. В конце оценки они оба отличаются от исходного состояния и в достаточном количестве случаев различаются между членами населения (ожидается несколько идентичных лиц).
Похоже, что рабочие не все редактируют оригинальные списки, созданные в основном контексте. Кто-нибудь может это подтвердить?