在python中跨多个进程共享一个类变量

时间:2016-02-13 17:46:11

标签: python locking multiprocessing

我有一个类变量声明为一个列表,我想从该类中声明的方法更新。但是,由于此方法处理大量数据,我使用多处理来调用它,因此我需要在更新之前锁定类变量。我无法弄清楚如何放置这样的锁并更新类变量。如果重要的话,我只是在任何时候创建该课程的一个对象。

2 个答案:

答案 0 :(得分:1)

由于python的GIL,多处理只能用于完全独立的任务,而不能使用共享内存。 但是你仍然可以通过使用多处理共享数组/值来实现它:

来自https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

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

现在正如您所问,您需要确保不同的进程不会同时访问同一个变量,并使用Lock。 Hopefuly,multiprocessing模块中可用的所有共享变量都与Lock配对。

要访问锁定:

num.acquire() # get the lock
# do stuff
num.release() # don't forget to release it

我希望这会有所帮助。

答案 1 :(得分:0)

如果您正在使用multiprocessing模块(而不是多线程,这是不同的),那么除非我弄错了,分叉的多个进程不共享内存并且每个进程都有自己的类副本。这意味着不需要锁定,但这也意味着类属性不会像您希望的那样共享。

多处理模块确实提供several ways以允许进程之间的通信,包括共享数组对象。也许这就是你要找的东西。

根据您正在做的事情,您可能还会考虑使用主工作模式,您可以在其中创建一个工作类,其中包含操作数据的方法,生成多个进程来运行此类,然后将数据集分派给工作人员使用多处理模块中的Queue类从主进程中获取。