问题描述
我创建了一个类,其中所有功能都可以工作,并且可以将其置于不同的过程中并进行编辑。除增加值功能外,所有功能均起作用。这是我的课程:
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
说实话,这可能是管理员字典的最初原因之一。无论如何,我希望如果有人需要此信息并偶然发现这篇文章对您有所帮助。