Как синхронизировать переменную с несколькими процессами в Python? - PullRequest
1 голос
/ 01 мая 2019

Я хотел бы использовать multiprocessing pool для доступа, чтения и изменения переменной в python.Процессы полностью разделены, но должны иметь доступ к одной и той же переменной.Это было бы легко сделать с помощью pointers в C, но как мне это сделать в python?

Например, я сделал это:

import multiprocessing as mp
import time
a=3

def one(arg):
        time.sleep(2*arg[1])
        print(arg)
        arg[0]+=1
        print(arg[0])
        return arg[0]

if __name__ == '__main__':
        with mp.Pool(processes=2) as pool:
                print(pool.map(one,[[a,1],[a,2]]))

Но он возвращает

[3, 1]

4

[3, 2]

4

[4, 4]

Вместо [4,5].

1 Ответ

1 голос
/ 01 мая 2019

Вы можете делить переменные между процессами. Использование общей памяти.

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[:])

Value и Array - это специальные объекты, которые позволяют вам разделять состояние между ними. d и i - это коды типов переменных, которыми вы хотите поделиться.

Однако это решение не предоставляет никакого механизма синхронизации. Вы должны быть осторожны, чтобы не читать и не писать одновременно.

Также это решение можно использовать только для простых значений. Если вам нужно поделиться объектом, вы должны взглянуть на Manager класс в multiprocessing модуле.

Приложение из документов

Менеджер, возвращаемый Manager (), будет поддерживать список типов, dict, пространство имен, Lock, RLock, семафор, BoundedSemaphore, условие, событие, барьер, очередь, значение и массив

Итак, как вы видите, вы также можете поделиться RLock, чтобы настроить механизм синхронизации для чтения и записи ваших общих переменных.

Подробнее здесь: https://docs.python.org/3.5/library/multiprocessing.html#sharing-state-between-processes

...