如何解决如何在一个类中嵌套多处理管理器字典
我创建了一个简单的类来存储多处理值。 init 函数如下所示:
def __init__(self):
Manager = multiprocessing.Manager()
self.FMT = '%Y/%m/%d %H:%M:%S:%f'
self.lock = multiprocessing.Lock()
self.grabDays = Manager.dict()
self.changeAmt = 0
self.command = multiprocessing.Value(ctypes.c_wchar_p,'start sequence')
self.get_best = multiprocessing.Value(ctypes.c_bool,False)
self.done = multiprocessing.Value(ctypes.c_bool,False)
self.status = multiprocessing.Value(ctypes.c_wchar_p,'nothing')
self.discrepencies = Manager.dict()
self.making = Manager.dict()
这很好用,但是如果我将Manager
设置为self.Manager
,但两者仍然等于multiprocessing.Manager()
。我试图将类传递给该类不能腌制的其他函数会出错。如果我要将Manager设为类变量,我也会收到错误消息。对于一本字典的简单操作来说,这很好用,但是我的类中有一些使用嵌套字典的函数。
例如:
Manager = multiprocessing.Manager()
num = 1
keys = list(self.grabDays.keys())
if num not in keys:
self.grabDays[num] = Manager.dict()
这不会返回错误,但是,其他进程看不到它是嵌套的并且已经对其进行了所有操作。有没有办法嵌套管理器词典?
解决方法
我认为这个解决方案可以解决,说实话,这不是很优雅,但是它确实有效。此嵌套词典示例将深入3个子词典,并涉及一个时间变量。这样一来,就不会有很多难以理解的事情了。
第一步是不要将要创建的字典初始化为创建的类中的管理器字典,而是初始化为管理器列表。看起来像这样:
def __init__(self):
self.manager = multiprocessing.Manager()
self.grabDays = self.manager.list()
很明显,您可以随便命名。接下来,我创建了一个函数将此列表初始化为特定的字符串,该字符串将告诉我的程序变量是什么。另外,请注意,我说的是三层字典,但是字符串中没有第三层。这是因为第三层将是由词典创建者功能初始化的词典中的计数器。字符串中的**的原因是因为我知道在要插入的任何变量中都不会连续出现2个星号。您显然可以选择任何分隔符,但重要的是要有一个分隔符,否则它将不起作用。
这是我添加值的功能:
def addGrabDaysClass(self,time,price,slope,volume,percentage,day,hour):
self.day = day
self.hour = hour
try: time = time.strftime('%Y/%m/%d %H:%M:%S:%f')
except: pass
self.grabDays.append(str(day)+'**'+str(hour)+'**'+str(slope)+'**'+str(price)+'**'+str(volume)+'**'+str(percentage)+'**'+str(time))
我还希望最多收集15天的数据,我还创建了一个工作功能来完成此任务,发布在下面:
import calendar
def updateGrabbedDaysDict(self):
#self.keys = self.grabDays.keys()
#del self.grabDays[self.keys[-1]]
storeToRemove = []
lister = list(self.get(name='grabDays',model='Array'))
list2 = lister[-1].split('**')
day = float(list2[0])
time = datetime.strptime(list2[6],'%Y/%m/%d %H:%M:%S:%f')
lastYear = time.year
lastMonth = time.month -1
if lastMonth < 0:
lastMonth = 12
lastYear - 1
daysPreviousMonth = calendar.monthrange(lastYear,lastMonth)[1]
dayLookFor = day-15
if dayLookFor < 0:
dayLookFor = daysPreviousMonth + dayLookFor
for i in range(len(lister)):
list2 = lister[i].split('**')
day = float(list2[0])
if dayLookFor == day:
storeToRemove.append(list2[i])
for i in range(len(storeToRemove)):
while storeToRemove[i] in self.grabDays:
self.grabDays.remove(storeToRemove[i])
这是我创建的函数,可以调用该函数将信息添加到管理器列表中,并确保其已更新:
from datetime import datetime
def addGrabDays(time,arg = None):
arg.addGrabDaysClass(time,time.day,time.hour)
arg.updateGrabbedDaysDict()
最后,这是将其返回到工作词典中的方式:
def returnData(name,arg=None):
if name == 'grabDays':
lister = list(arg.get(name='grabDays',model='Array'))
dictionary = {}
#self.grabDays.append(str(day)+'**'+str(hour)+'**'+str(slope)+'**'+str(price)+'**'+str(volume)+'**'+str(percentage)+'**'+str(time))
for i in range(len(lister)):
list2 = lister[i].split('**')
day = float(list2[0])
hour = float(list2[1])
slope = float(list2[2])
price = float(list2[3])
volume = float(list2[4])
percentage = float(list2[5])
time = datetime.strptime(list2[6],'%Y/%m/%d %H:%M:%S:%f')
keys = list(dictionary.keys())
if day not in keys:
dictionary[day] = {}
keys = list(dictionary[day].keys())
if hour not in keys:
dictionary[day][hour] = {}
keys = list(dictionary[day][hour].keys())
if not keys:
counter = 0
else:
counter = keys[-1]+1
dictionary[day][hour][counter] = {'slope':slope,'price':price,'volume':volume,'time':time,'percentage':percentage}
return dictionary
请注意,我从输入字符串的那部分复制了注释,这样我就不必每次都上下滚动。将代码放在一个名为storeData的python文件中之后,我可以创建一个测试器示例。如果您仍在阅读并且对基本内容感兴趣,但是为了证明该代码有效,请参考以下示例:
代码:
from storeData import *
import multiprocessing
import time
from datetime import datetime
def try2(arg):
now = datetime.now()
for i in range(0,35):
addGrabDays(time=now,price=(i*9),slope=(i*5),volume=(i*3),percentage=(i*8),arg = arg)
time.sleep(1)
print('going to print in next process')
time.sleep(2)
print('done!')
def nextTry(arg):
time.sleep(2)
print(returnData('grabDays',arg=arg))
def foregrounder():
ult = data()
p1 = Process(target = try2,args=(ult,))
p1.start()
p2 = Process(target = nextTry,))
p2.start()
p1.join()
p2.join()
if __name__ == "__main__":
foregrounder()
代码结果:
going to print in next process
{14.0: {16.0: {0: {'slope': 0.0,'price': 0.0,'volume': 0.0,'time': datetime.datetime(2020,8,14,16,383679),'percentage': 0.0},1: {'slope': 5.0,'price': 9.0,'volume': 3.0,'percentage': 8.0},2: {'slope': 10.0,'price': 18.0,'volume': 6.0,'percentage': 16.0},3: {'slope': 15.0,'price': 27.0,'volume': 9.0,'percentage': 24.0},4: {'slope': 20.0,'price': 36.0,'volume': 12.0,'percentage': 32.0},5: {'slope': 25.0,'price': 45.0,'volume': 15.0,'percentage': 40.0},6: {'slope': 30.0,'price': 54.0,'volume': 18.0,'percentage': 48.0},7: {'slope': 35.0,'price': 63.0,'volume': 21.0,'percentage': 56.0},8: {'slope': 40.0,'price': 72.0,'volume': 24.0,'percentage': 64.0},9: {'slope': 45.0,'price': 81.0,'volume': 27.0,'percentage': 72.0},10: {'slope': 50.0,'price': 90.0,'volume': 30.0,'percentage': 80.0},11: {'slope': 55.0,'price': 99.0,'volume': 33.0,'percentage': 88.0},12: {'slope': 60.0,'price': 108.0,'volume': 36.0,'percentage': 96.0},13: {'slope': 65.0,'price': 117.0,'volume': 39.0,'percentage': 104.0},14: {'slope': 70.0,'price': 126.0,'volume': 42.0,'percentage': 112.0},15: {'slope': 75.0,'price': 135.0,'volume': 45.0,'percentage': 120.0},16: {'slope': 80.0,'price': 144.0,'volume': 48.0,'percentage': 128.0},17: {'slope': 85.0,'price': 153.0,'volume': 51.0,'percentage': 136.0},18: {'slope': 90.0,'price': 162.0,'volume': 54.0,'percentage': 144.0},19: {'slope': 95.0,'price': 171.0,'volume': 57.0,'percentage': 152.0},20: {'slope': 100.0,'price': 180.0,'volume': 60.0,'percentage': 160.0},21: {'slope': 105.0,'price': 189.0,'volume': 63.0,'percentage': 168.0},22: {'slope': 110.0,'price': 198.0,'volume': 66.0,'percentage': 176.0},23: {'slope': 115.0,'price': 207.0,'volume': 69.0,'percentage': 184.0},24: {'slope': 120.0,'price': 216.0,'volume': 72.0,'percentage': 192.0},25: {'slope': 125.0,'price': 225.0,'volume': 75.0,'percentage': 200.0},26: {'slope': 130.0,'price': 234.0,'volume': 78.0,'percentage': 208.0},27: {'slope': 135.0,'price': 243.0,'volume': 81.0,'percentage': 216.0},28: {'slope': 140.0,'price': 252.0,'volume': 84.0,'percentage': 224.0},29: {'slope': 145.0,'price': 261.0,'volume': 87.0,'percentage': 232.0},30: {'slope': 150.0,'price': 270.0,'volume': 90.0,'percentage': 240.0},31: {'slope': 155.0,'price': 279.0,'volume': 93.0,'percentage': 248.0},32: {'slope': 160.0,'price': 288.0,'volume': 96.0,'percentage': 256.0},33: {'slope': 165.0,'price': 297.0,'volume': 99.0,'percentage': 264.0},34: {'slope': 170.0,'price': 306.0,'volume': 102.0,'percentage': 272.0}}}}
done!
如果仔细观察,您会发现制作了35个实例(包括零个实例),它具有3层。尽管由于它们是在同一时间制造的,所以您将不得不相信我,不同时间和日期的多层仍然可以像上面演示的计数器那样工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。