首页 > 解决方案 > 更新的类属性未反映在多处理功能中

问题描述

我有一个在 Windows 上运行的 Python 3.6.6 多处理函数

import multiprocessing as mp

class Foo:
    def __new__(cls):
        return None
    name = 'apple'

    @staticmethod
    def worker():
        print(f'Inside worker => {Foo.name}')

    @staticmethod
    def caller():
        for _ in range(3):
            p = mp.Process(target=Foo.worker)
            p.start()
            p.join()


if __name__ == '__main__':
    Foo.name ='ball'
    Foo.caller() # worker prints apple
    Foo.worker() # prints ball

据我了解,在函数worker中,类属性的值name应该 ball但实际上是apple.

我为此寻找解释,但找不到任何解释。提前致谢。

标签: pythonpython-3.xmultiprocessingattributes

解决方案


您的程序有 4 个进程:1 个主进程和 3 个子进程。您在main进程中修改类属性,但任何新生成的进程都将使用类定义中的值再次加载该类。

线程和进程之间的主要区别在于共享内存。如果您使用Threads 而不是Processes,您将看到它将使用修改后的类定义:

p = threading.Thread(target=Foo.worker)

推荐阅读