Python多处理:如何将共享变量用于复杂类的列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多处理:如何将共享变量用于复杂类的列表?相关的知识,希望对你有一定的参考价值。

在Python中使用多处理时,我希望将类列表作为共享变量。该类可以看作如下(简化):

class testClass():
def __init__(self):
    self.a = []
    self.b = []

然后,我使用多处理来处理'testClass'列表:

from multiprocessing import Process, Manager

def testProc(a_list):
    for i in range(10):
        a_list[1].a.append([1])
        print('a_list[1] address: in processing', a_list[1])

if __name__ == '__main__':
    manager = Manager()
    testList = [testClass() for i in range(4)]
    a_list = manager.list(testList)
    print('a_list[1] address: initial ', a_list[1])
    process_0 = Process(target=testProc, args=(a_list,))
    process_0.start()
    process_0.join()
    print('a_list[1] address: final ', a_list[1])

然后结果是:

a_list[1] address: initial <__main__.testClass object at 0x7f666c160f60>
a_list[1] address: in processing <__main__.testClass object at 0x7f666c16cf28>
a_list[1] address: in processing <__main__.testClass object at 0x7f666c16cf28>
a_list[1] address: final <__main__.testClass object at 0x7f666c160f98>

可以看出,列表元素的地址可能因地而异,不能充当共享变量。我怎么解决这个问题?

答案

ab类属性移到__init__函数之外

class testClass(): a = [] b = []

通过这种方式,ab将成为类变量,由所有testClass实例共享。

Class and Instance Variables in Python

以上是关于Python多处理:如何将共享变量用于复杂类的列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 的多处理中创建嵌套共享对象?

在 python 多处理中传递共享内存变量

python多处理中的共享变量

使用 python socketserver 如何将变量传递给处理程序类的构造函数

java多线程执行任务,处理共享成员变量的安全问题

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表