Список добавления для многопроцессорности 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]