【问题标题】:Python multiprocessing: object identifier unique across processesPython多处理:跨进程的对象标识符唯一
【发布时间】:2014-10-10 21:21:17
【问题描述】:

假设您要并行运行多个进程(使用多处理,可能在多个单独的机器上,如在一个集群中),其中每个进程创建一个特定类的新实例列表。然后,您将所有这些列表发送回父进程,并希望将它们组合起来。现在,我们可以通过它们的对象 id 来索引这些实例吗?鉴于每个对象都是在单独的进程(可能是单独的机器)上生成的,我能否期望 id 能够唯一标识对象?

换句话说,对象的 id 是否能够在进程之间发送数据所需的酸洗中幸存下来,或者解释器在解开对象时是否为对象分配了一个新鲜且唯一的 id?

【问题讨论】:

    标签: python pickle python-multiprocessing


    【解决方案1】:

    您问,对象的 id 是否在酸洗后仍然存在?答案是不。对象被腌制并发送到另一个进程,并在该进程中创建一个具有新 id 的新对象。结果被发送回原始过程。 id 无法生存……它们是不同的对象。即使在同一过程中,Id 也经常无法在酸洗中幸存下来……试试obj2 = pickle.loads(pickle.dumps(object)) 看看obj2 is object 是否……通常情况并非如此。

    >>> import dill
    >>>     
    >>> class A(object):
    ...   pass
    ... 
    >>> b = A()
    >>> 
    >>> id(b)
    4473714832
    >>> id(dill.loads(dill.dumps(b)))  
    4486366032
    >>> 
    

    但是,如果您想维护一个“id”来了解哪个对象是哪个,您可以。只需添加一个 id 属性来存储一些 id 信息(可以是一个简单的数字,例如进程“排名”(顺序),也可以是随机生成的哈希,或者其他……你选择)。如果您提前创建此属性并将“id”存储在那里,它应该在pickle 中维护此信息。但是,如果您尝试将id 属性动态添加到任何对象,那么pickle 将“忘记”该属性已添加,并且反序列化的对象将不具有该属性。或者,如果您使用像 dill 这样的“高级”序列化程序,您可以在类实例或几乎任何对象上腌制动态添加的属性。

    【讨论】:

    • 我认为您的意思是他的问题的答案是“是”- 他问 “鉴于每个对象都是在单独的进程上生成的,我能否期望 id 唯一标识对象(可能是单独的机器)?” 他想知道在父进程中是否保证 ID 是唯一的。他们是,出于你提到的确切原因。
    • 我的意思是不。我在回答“对象的 id 是否能在酸洗中幸存……”但我应该澄清一下,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多