如何在python中将变量与多个进程同步?

时间:2019-05-01 10:42:25

标签: python synchronization multiprocessing

我想使用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 个答案:

答案 0 :(得分:1)

您可以在进程之间共享变量。使用共享内存。

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

ValueArray是特殊的对象,可让您在它们之间共享状态。 di是您要共享的变量类型的印刷代码。

但是,此解决方案不提供任何同步机制。您需要注意不要同时读写。

此解决方案也只能用于简单值。如果需要共享对象,则应查看Manager模块中的multiprocessing类。

来自文档的努力

  

由Manager()返回的管理器将支持类型列表,字典,命名空间,锁,RLock,信号量,BoundedSemaphore,条件,事件,屏障,队列,值和数组

因此,如您所见,您还可以共享RLock来设置用于读写共享变量的同步机制。

此处有更多信息:https://docs.python.org/3.5/library/multiprocessing.html#sharing-state-between-processes