Список добавления для многопроцессорности Python
У вас есть быстрый вопрос об общей переменной между несколькими процессами, используя Multiprocessing.Pool().
Будет ли я работать с любыми проблемами, если я обновляю глобальный список из нескольких процессов? То есть если два из процессов должны были попытаться обновить список в одно и то же время.
Я видел документацию об использовании Lock для подобных вещей, но мне было интересно, если это необходимо.
EDIT:
Способ обмена этой переменной заключается в использовании глобальной переменной в моей функции обратного вызова,
"успехи", в которых я добавляю все успешные действия после завершения целевой функции:
TOTAL_SUCCESSES = []
def func(inputs):
successes = []
for input in inputs:
result = #something with return code
if result == 0:
successes.append(input)
return successes
def callback(successes):
global TOTAL_SUCCESSES
for entry in successes:
TOTAL_SUCCESSES.append(entry)
def main():
pool = mp.Pool()
for entry in myInputs:
pool.apply_async(func, args=(entry,),callback=callback)
Извините за любые ошибки синтаксиса, быстро написал это, но программа работает, просто задаваясь вопросом, добавляю ли я общую переменную, если у меня возникнут проблемы.
Спасибо заранее!
Ответы
Ответ 1
С вашим текущим кодом вы фактически не используете CURRENT_SUCCESSES
между процессами. callback
выполняется в основном процессе, в потоке обработки результата. Существует только один поток обработки результата, поэтому каждый callback
будет запускаться один за раз, а не одновременно. Таким образом, ваш код написан как безопасный процесс/поток.
Однако вы забываете вернуть successes
из func
, который вы хотите исправить.
Edit:
Кроме того, это может быть гораздо более сжато написано с помощью map
:
def func(inputs):
successes = []
for input in inputs:
result = #something with return code
if result == 0:
successes.append(input)
return successes
def main():
pool = mp.Pool()
total_successes = pool.map(func, myInputs) # Returns a list of lists
# Flatten the list of lists
total_successes = [ent for sublist in total_successes for ent in sublist]