Проблемы записи в список за пределами функции при использовании многопроцессорной карты - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть код, который я пытаюсь запустить параллельно, чтобы ускорить его.Короче говоря, сценарий выполняет итерацию по многим файлам, и из каждого файла извлекает фрейм данных, выполняет некоторые вычисления на фрейме данных, затем записывает имя файла и извлеченные / вычисленные данные во временный список, а затем, поскольку это временный список,перезаписывается при обработке каждого нового файла, он добавляется в основной список, который должен включать все обработанные файлы после завершения сценария.

У меня есть основной код обработки файлов как функция.Если я запускаю код нормально, тогда список основных файлов заполняется соответствующим образом, но когда я запускаю его с помощью пула и карты, он всегда пуст.

, например

# some code to generate file list as file_list

master_list = []

def myfunc(fle):
    with open fle as f: # long set of data extraction instructions

    temp_list.insert(filename, 0)
    temp_list.insert(data1, 1)
    temp_list.insert(data2, 2)

    print(temp_list) # check temp list in func works and it does

    append.master_list(temp_list)

    print(master_list) # master_list in func correctly contains temp_list data

Если я позвонюОбычно эта функция работает нормально.

for i in file_list:
    myfunc(i)

print (master_list) # master_list is populated with data from all files

, но если я попытаюсь распараллелить функцию с pool.map, результирующий master_list будет пуст, даже если все правильные данные присутствуют в temp_list, и эти данные добавляютсяв master_list (как я вижу из операторов печати внутри функции myfunc).

pool = Pool(4) 
pool.map(myfunc, file_list)
pool.close()
pool.join() 

print(master_list) # master_list is empty

Странно то, что это происходит даже тогда, когда я ограничиваю пул 1 пулом процессоров = Pool (1)

Я что-то упускаю из-за того, как пул и карта работают вместе?Я думал, что это может быть проблема с очередью, но тогда, конечно, ограничение одного процессора исправит пустой master_list, чего нет?

Любой совет приветствуется

1 Ответ

0 голосов
/ 01 апреля 2019

Попробуйте вернуть список из myfunc, не добавляя его в основной список, а затем выполните:

master_list = pool.map(myfunc, file_list)

Короче говоря, добавление в список не работает при запуске многопоточности.Итак, вы должны вернуть отдельный список из функции, а затем объединить его вместе, используя объект пула.

...