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

Share a class variable across multiple processes in python

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

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

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

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

由于python的GIL,多处理只能用于完全独立的任务,不能共享内存。 但是您仍然可以通过使用 multiprocessing shared Array/Value:

来实现它

来自 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。希望 multiprocessing 模块中所有可用的共享变量都与锁配对。

访问锁:

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

希望对您有所帮助。