更新的 class 属性未反映在多处理函数中
Upated class attribute not getting reflected in multiprocessing function
我在 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
中 class 属性 name
的值应该 ball
但实际上它是 apple
.
我正在寻找对此的解释,但找不到任何解释。提前致谢。
您的程序有 4 个进程:1 个主进程和 3 个子进程。您修改 main
进程中的 class 属性,但任何新生成的进程将使用 class 定义中的值再次加载 class。
线程和进程的主要区别在于共享内存。如果您使用 Thread
s 而不是 Process
es,您将看到它将使用修改后的 class 定义:
p = threading.Thread(target=Foo.worker)
我在 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
中 class 属性 name
的值应该 ball
但实际上它是 apple
.
我正在寻找对此的解释,但找不到任何解释。提前致谢。
您的程序有 4 个进程:1 个主进程和 3 个子进程。您修改 main
进程中的 class 属性,但任何新生成的进程将使用 class 定义中的值再次加载 class。
线程和进程的主要区别在于共享内存。如果您使用 Thread
s 而不是 Process
es,您将看到它将使用修改后的 class 定义:
p = threading.Thread(target=Foo.worker)