首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多进程共享字典(TypeError:无法对“弱over”对象进行筛选)

多进程共享字典(TypeError:无法对“弱over”对象进行筛选)
EN

Stack Overflow用户
提问于 2022-09-23 19:16:29
回答 1查看 60关注 0票数 0

我想要创建一个类Storage,其中每个对象都有一个字典orderbooks作为属性。我希望通过调用方法orderbooks从主进程在write上编写,但我希望将此操作推迟到另一个进程,并确保从主进程可以访问字典orderbooks

为此,我创建了一个在对象定义期间传递的Mananger(),它用于通知有关字典更改的进程。我的代码如下:

代码语言:javascript
运行
复制
from multiprocessing import Process, Manager

class Storage():
    def __init__(self,manager):
        self.manager = manager
        self.orderbooks = self.manager.dict()

    def store_value(self,el):
        self.orderbooks[el[0]] = el[1]

    def write(self,el:list):
        p = Process(target=self.store_value,args=(el,))
        p.start()


if __name__ == '__main__':

    manager=Manager()
    book1 = Storage(manager)
    book1.write([0,1])

然而,当我运行这段代码时,我会得到以下错误

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "/Users/main_user/PycharmProjects/handle_queue/main.py", line 21, in <module>
    book1.write([0,1])
  File "/Users/main_user/PycharmProjects/handle_queue/main.py", line 13, in write
    p.start()
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/process.py", line 121, in start
    self._popen = self._Popen(self)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/context.py", line 284, in _Popen
    return Popen(process_obj)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/popen_spawn_posix.py", line 32, in __init__
    super().__init__(process_obj)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/popen_spawn_posix.py", line 47, in _launch
    reduction.dump(process_obj, fp)
  File "/Users/main_user/opt/anaconda3/envs/handle_queue/lib/python3.10/multiprocessing/reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'weakref' object

我的密码怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 12:52:32

阿伦的评论如下:

代码语言:javascript
运行
复制
from multiprocessing import Process, Manager

class Storage():
    def __init__(self, orderbooks):
        self.orderbooks = orderbooks

    def store_value(self, el):
        self.orderbooks[el[0]] = el[1]

    def write(self, el: list):
        p = Process(target=self.store_value, args=(el,))
        p.start()
        # Ensure we do not return until store_value has
        # completed updating the dictionary:
        p.join()


if __name__ == '__main__':
    manager = Manager()
    orderbooks = manager.dict()
    book1 = Storage(orderbooks)
    book1.write([0, 1])
    print(orderbooks)

指纹:

代码语言:javascript
运行
复制
{0: 1}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73832064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档