我正在尝试生成子进程,这些子进程通过传递的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"
}
答案 0 :(得分:2)
对象-有关它的所有内容,包括ID-被复制到进程中。这与deepcopy
不同,后者将创建一个新对象。它是同一对象复制到另一个内存空间。
有关更多信息,请参见以下答案: