首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与放置和进入队列不同的对象

与放置和进入队列不同的对象
EN

Stack Overflow用户
提问于 2020-06-07 19:48:46
回答 1查看 306关注 0票数 3

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

代码语言:javascript
复制
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

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

为什么是这种情况?如何将同一个对象放入队列并将其放入队列中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 20:14:30

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

注当一个对象被放到一个队列中时,该对象会被腌制,后台线程稍后会将被腌制的数据刷新到底层管道中。

即使队列中的使用者运行在与生产者相同的进程中,也会发生这种情况。默认情况下,对象的标识不会通过酸洗来保存(请参阅this question,您可以尝试通过自定义对象的酸洗过程来保存它)。但是,如果可能的话,最好调整实现,使其不依赖对象的id (如果可能的话)。

对于某些内置的不可变类型(如小整数),您可以看到id保持不变,因为Python中间缓存这些实例,并且总是重复使用相同的实例。因此,未被腌制的int最终是对您放入队列的完全相同的int的引用。对于自定义类型,情况并非如此。如果您尝试使用大量( Python不缓存),那么您将看到从队列中提取id后的id更改,就像对自定义类型一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62250773

复制
相关文章

相似问题

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