gpt4 book ai didi

python - 放入和进入队列的不同对象

转载 作者:行者123 更新时间:2023-12-05 03:52:20 24 4
gpt4 key购买 nike

我正在尝试实现一个队列以在 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

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

为什么会这样?如何将同一个对象放入和获取到队列中?

最佳答案

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

Note When an object is put on a queue, the object is pickled and a background thread later flushes the pickled data to an underlying pipe.

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

你会看到一些内置的不可变类型(比如小整数)的 id 保持不变,因为 Python 在内部缓存了这些实例,并且总是重复使用同一个。因此,unpickled int 最终成为对您放入队列中的完全相同的 int 的引用。自定义类型不是这种情况。如果您尝试大量(Python 不缓存),您会在从队列中提取它后看到 id 发生变化,这与自定义类型的情况相同。

关于python - 放入和进入队列的不同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62250773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com