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

时间:2019-12-09 15:20:35

标签: 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 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)

1 个答案:

答案 0 :(得分:1)

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!