关于共享内存在 Python 的多编程库中如何工作的问题

Question on how shared memory works in Python's multi programming library

我确定之前已经回答过这个问题,但我很想知道为什么会这样。我的猜测是它要么与 Python 的传递对象引用属性有关,要么与共享内存有关。

为什么当我动态更改 ThreadSafeInt 中的 self.size 变量时,它不会更新所有其他线程拥有的副本?

输出:

Value = 10
Value = 10
Value = 20
Done!

main.py

def change(num):
     num.setNum(20)

if __name__ == "__main__": 
     import sys
     num = ThreadSafeInt.ThreadSafeInt()
     num.setNum(10)
     print("Value = " + str(num.get()))
     #Changing value in different thread
     p3 = multiprocessing.Process(target=change, args=(num,)) 
     p3.start()
     p3.join()
     print("Value = " + str(num.get()))
     #Changing the value in same thread
     num.setNum(20)
     print("Value = " + str(num.get()))
     print("Done!")

ThreadSafeInt.py

import multiprocessing

class ThreadSafeInt:
     def __init__(self):
          self.size = multiprocessing.Value('i', 0)
          self.lock = multiprocessing.RLock()

     def get(self):
          with self.lock:
               return self.size.value
     def setNum(self, num):
          with self.lock:
               self.size = multiprocessing.Value('i', num)

setNum 函数中,当您设置新值时,您正在定义一个新的 Value 对象,因此您不会修改现有对象。 如果您将代码更改为:

class ThreadSafeInt:
     def __init__(self):
          self.size = multiprocessing.Value('i', 0)
          self.lock = multiprocessing.RLock()

     def get(self):
          with self.lock:
               return self.size.value
     def setNum(self, num):
          with self.lock:
               self.size.value = num   <--- change this line

它会起作用。

Output:
Value = 10
Value = 20
Value = 20
Done!