关于共享内存在 Python 的多编程库中如何工作的问题
Question on how shared memory works in Python's multi programming library
我确定之前已经回答过这个问题,但我很想知道为什么会这样。我的猜测是它要么与 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
它会起作用。
Output:
Value = 10
Value = 20
Value = 20
Done!
我确定之前已经回答过这个问题,但我很想知道为什么会这样。我的猜测是它要么与 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
它会起作用。
Output:
Value = 10
Value = 20
Value = 20
Done!