首页 > 解决方案 > 有没有办法让一个类添加多处理共享值?

问题描述

我创建了一个类,其中所有功能都可以工作,并且可以放入不同的进程并进行编辑。除增值功能外,所有功能均有效。这是我的课:

class data(object):

def __init__(self):
    Manager = multiprocessing.Manager()
    self.lock = multiprocessing.Lock()
    self.changeAmt = 0
    self.jump = multiprocessing.Value(ctypes.c_float, 0.02)
    self.has_best = multiprocessing.Value(ctypes.c_bool, False)
    self.best_list = Manager.list()
    self.command_original = 'start sequence'
    self.command = multiprocessing.Value(ctypes.c_wchar_p, self.command_original)
    self.get_best = multiprocessing.Value(ctypes.c_bool, False)
    self.done = multiprocessing.Value(ctypes.c_bool, False)

def get(self, name, model):
    self.model = model
    if model != 'Array':
        with multiprocessing.Lock():
            exec('self.now = self.'+name)
            return self.now.value 
    if self.model == 'Array':
        exec('self.now = self.'+name)
        return self.now

def edit(self, name, model, changeAmt):
    self.changeAmt = changeAmt
    if model != 'Array':
        with multiprocessing.Lock():
            exec('self.'+name+'.value = self.changeAmt')
    if model == 'Array':
        for i in range(len(changeAmt)):
            exec('self.'+name+'.append(changeAmt[i])')

def addValue(self, name, value):
    self.now = value
    exec('self.'+name+' = self.now')

然后可以在主函数中正确使用这些代码行:

ult = data()
p1 = Process(target = try2, args=(ult,))
p1.start()
p2 = Process(target = nextTry, args=(ult,))
p2.start()
p1.join()
p2.join()

当我在代码中使用 addValue 函数时,第一个进程运行良好,并且可以在调用 get 函数时返回值。但是,当我为第二个进程调用 get 函数时,它失败了。我对解决方案的一个想法是使用多处理队列方法并让两个进程都增加价值。虽然,我有一种感觉,即使两个函数都添加了值,如果其中一个函数改变了值,它也不会改变。我想要完成的工作是可行的,还是应该从一开始就尝试初始化所有变量?

标签: pythonmultiprocessing

解决方案


我发现这样做的唯一方法是使用多处理字典,我在下面发布了初始化程序和创建者的工作示例。

def __init__(self):
        Manager = multiprocessing.Manager()
        self.allDict = Manager.dict()
        self.allDict['status'] = 'nothing'
        self.allDict['done'] = False
        self.allDict['changeAmt'] = 0
        self.allDict['command'] = 'start sequence'
        self.allDict['get_best'] = False

那么如果你想添加一个常规值:

 def addValue(self, name, value):
        self.allDict[name] = value

老实说,这可能是经理字典的最初原因之一。无论如何,我希望如果有人需要这些信息并偶然发现这篇文章,它会有所帮助。


推荐阅读