我确定以前已经回答过,但是我很想了解为什么会这样。我的猜测是与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)
答案 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!