我正在尝试实现一个队列,以便在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如果我使用原子元素(如数字),则不会发生这种情况。
为什么是这种情况?如何将同一个对象放入队列并将其放入队列中?
发布于 2020-06-07 20:14:30
注当一个对象被放到一个队列中时,该对象会被腌制,后台线程稍后会将被腌制的数据刷新到底层管道中。
即使队列中的使用者运行在与生产者相同的进程中,也会发生这种情况。默认情况下,对象的标识不会通过酸洗来保存(请参阅this question,您可以尝试通过自定义对象的酸洗过程来保存它)。但是,如果可能的话,最好调整实现,使其不依赖对象的id (如果可能的话)。
对于某些内置的不可变类型(如小整数),您可以看到id保持不变,因为Python中间缓存这些实例,并且总是重复使用相同的实例。因此,未被腌制的int最终是对您放入队列的完全相同的int的引用。对于自定义类型,情况并非如此。如果您尝试使用大量( Python不缓存),那么您将看到从队列中提取id后的id更改,就像对自定义类型一样。
https://stackoverflow.com/questions/62250773
复制相似问题