我正在尝试实现一个队列,以便在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
如果我使用原子元素(例如数字(,则不会发生这种情况。
为什么会这样呢?如何将相同的对象放入队列中并获取?
您会看到此行为,因为添加到multiprocessing
队列的所有对象在插入时都会被酸洗,在检索它们时会被取消酸洗:
放入队列时,将酸洗该对象,稍后后台线程会将酸洗的数据刷新到基础管道。
即使队列中的使用者在与生产者相同的进程中运行,也会发生这种情况。默认情况下,对象的标识不会通过酸洗来保留(尽管请参阅此问题,了解如何尝试通过自定义对象的酸洗过程来保留它(。但是,如果可能的话,最好调整您的实现,使其不依赖于对象在酸洗/脱酸洗过程中保持不变的id
。
您会看到某些内置的不可变类型(如小整数(的 id 保持不变,因为 Python 内部缓存这些类型的实例,并且始终重用相同的实例。因此,未腌制的int
最终会引用您放入队列的完全相同int
。自定义类型并非如此。如果您尝试使用大量数字(Python 不缓存(,则从队列中提取后,您将看到 id 更改,与自定义类型相同。