关于Python中共享内存如何工作的问题';s多程序库

关于Python中共享内存如何工作的问题';s多程序库,python,multiprogramming,Python,Multiprogramming,我相信这已经得到了回答,但我很想了解为什么会发生这种情况。我的猜测是它要么与Python的对象引用传递属性有关,要么与共享内存有关 为什么在动态更改ThreadSafeInt中的self.size变量时,它不更新所有其他线程拥有的副本 输出: Value = 10 Value = 10 Value = 20 Done! main.py def change(num): num.setNum(20) if __name__ == "__main__": import sy

我相信这已经得到了回答,但我很想了解为什么会发生这种情况。我的猜测是它要么与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

您正在更改实例的值,例如在init中声明的某个值,这些值属于对象而不是类。
Output:
Value = 10
Value = 20
Value = 20
Done!