id()的含义,为什么与Process fork不同的对象具有相同的id()值?

时间:2019-01-17 20:58:21

标签: python

我正在尝试生成子进程,这些子进程通过传递的dict参数返回其结果。

在我看来,在Process.start()被调用之后,传递的字典以某种形式被复制,因为其中一个的变化未反映在另一个中。但是,在父进程和子进程中,id()是相同的值。

从本文开始,我希望id()返回一个对象的唯一值。 https://www.programiz.com/python-programming/methods/built-in/id

  

id()函数返回对象的标识。这是整数   对于给定的对象而言是唯一的,并且在给定对象期间保持不变   一生。

import json
from multiprocessing import Process
from time import sleep

def my_format(obj):
    return ('id(obj):' + str(id(obj)) +'; obj:' + json.dumps(obj, indent = 4))

def work(result):
    result['child'] = 'only'
    sleep(5)
    # child does not see entry from parent, must be different object
    # ie missing result['parent'] == 'only'
    print('child thread: ' + my_format(result))
    return

result = {}
p = Process(target = work, args = (result,))

result['both'] = 'see'
p.start() # fork(), which copies the object including its id()
result['parent'] = 'only'
sleep(5)
p.join()
# parent does not see entry from child, must be different object
# ie missing result['child'] == 'only'
print('main thread: ' + my_format(result))

出乎意料的是,子级result和父级result的内容有所不同。即一个方面的变化不会反映在另一个方面。

child thread: id(obj):4385974824; obj:{
    "both": "see",
    "child": "only"
}
main thread: id(obj):4385974824; obj:{
    "both": "see",
    "parent": "only"
}

1 个答案:

答案 0 :(得分:2)

对象-有关它的所有内容,包括ID-被复制到进程中。这与deepcopy不同,后者将创建一个新对象。它是同一对象复制到另一个内存空间。

有关更多信息,请参见以下答案:

python multiprocessing arguments: deep copy?