如何在一个类中嵌套多处理管理器字典

如何解决如何在一个类中嵌套多处理管理器字典

我创建了一个简单的类来存储多处理值。 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-