Использование глобальных переменных в многопроцессорном пуле - PullRequest
0 голосов
/ 12 июля 2020

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

У меня есть функция, которую я хочу использовать с pool.map. Я хочу, чтобы на входе этой функции было несколько глобальных переменных, а также еще один параметр, который меняет процесс от процесса к процессу. То есть мне нужно что-то вроде:


if __name__ == '__main__':

   A = Global Variable Array
   B = Global Variable Array
   C = Actual Input Array For the Multiprocessing

   pool = multiprocessing.Pool()
   Res= pool.map(Function,Input = A,B,C)

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

1 Ответ

1 голос
/ 12 июля 2020

multiprocessing предоставляет несколько способов обмена состоянием между процессами. Доступ к этим объектам может быть синхронизирован с помощью lock аргумента.

Если lock имеет значение True (по умолчанию), то создается новый объект рекурсивной блокировки для синхронизации доступа к значению. Если lock является объектом Lock или RLock, то он будет использоваться для синхронизации доступа к значению. Если lock имеет значение False, то доступ к возвращаемому объекту не будет автоматически защищен блокировкой, поэтому он не обязательно будет «безопасным для процесса».

Пример из официальной документации:

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
...