【问题标题】:Question on how shared memory works in Python's multi programming library关于共享内存如何在 Python 的多编程库中工作的问题
【发布时间】: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 中声明的东西,属于对象而不是类。

标签: python multiprogramming


【解决方案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!

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2023-04-03
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多