有没有办法让一个类添加多处理共享值?

问题描述

我创建了一个类,其中所有功能都可以工作,并且可以将其置于不同的过程中并进行编辑。除增加值功能外,所有功能均起作用。这是我的课程:

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,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,value):
    self.now = value
    exec('self.'+name+' = self.now')

然后可以在主函数中的以下几行代码中正确使用其中的代码:

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

当我打算在代码中使用addValue函数时,第一个过程可以很好地工作,并且可以在调用get函数时返回该值。但是,当我去调用第二个过程的get函数时,它失败了。我对解决方案的想法之一是使用多重处理Queue方法,并让两个进程都增加价值。虽然,即使两个函数都添加了值,我也有感觉,即使其中一个函数更改了值,它也不会改变。是我要完成的事情是可行的,还是应该只是从头开始初始化所有变量?

解决方法

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

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

说实话,这可能是管理员字典的最初原因之一。无论如何,我希望如果有人需要此信息并偶然发现这篇文章对您有所帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...