关于Python中共享内存如何工作的问题';s多程序库
我相信这已经得到了回答,但我很想了解为什么会发生这种情况。我的猜测是它要么与Python的对象引用传递属性有关,要么与共享内存有关 为什么在动态更改ThreadSafeInt中的self.size变量时,它不更新所有其他线程拥有的副本 输出:关于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
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!