【发布时间】:2019-12-09 15:20:35
【问题描述】:
我确信这个问题之前已经得到解答,但我很想了解为什么会发生这种情况。我的猜测是它要么与 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)
【问题讨论】:
-
您正在更改实例的值,例如在 init 中声明的东西,属于对象而不是类。