【问题标题】:Different objects from putting and getting in queues放入和进入队列的不同对象
【发布时间】:2020-06-07 19:48:46
【问题描述】:

我正在尝试实现一个队列以在 Python 中的进程之间共享一些对象(例如列表)。但是,我放入队列中的对象与之后得到的对象不同:

from multiprocessing import Queue
q = Queue()
a = [1,2,3]
print(id(a)) # prints 4389597128
q.put(a)
b = q.get()
print(id(b)) # prints 4389600080

如果我使用原子元素,例如数字,则不会发生这种情况。

为什么会这样?如何将相同的对象放入队列并从中获取?

【问题讨论】:

    标签: python python-3.x multiprocessing queue python-multiprocessing


    【解决方案1】:

    您看到这种行为是因为 all objects added to a multiprocessing Queue are pickled when inserted, and unpickled when they are retrieved:

    注意当一个对象被放入队列时,对象会被pickle,然后后台线程将pickled的数据刷新到底层管道。

    即使队列中的消费者与生产者在同一进程中运行,也会发生这种情况。默认情况下,不会通过酸洗保留对象的身份(尽管请参阅this question 了解您可以尝试通过自定义对象的酸洗过程来保留它的方法)。但是,如果可能的话,您最好调整您的实现,使其不依赖于在酸洗/解酸过程中保持不变的对象的id

    您会看到某些内置不可变类型(如小整数)的 id 保持不变,因为 Python 内部缓存了这些实例,并且总是重复使用相同的实例。因此,未腌制的int 最终成为对您放入队列中的完全相同的int 的引用。这不是自定义类型的情况。如果您尝试使用大量数字(Python 不会缓存),您会在从队列中拉出它后看到 id 更改,与自定义类型相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多