更改要复制的对象时深度复制的行为

时间:2016-04-08 17:12:18

标签: python python-2.7

如果线程A正在复制的对象(使用python 2.7的拷贝库中的deepcopy函数)被线程B同时更改,那么预期会发生什么?

编辑: 要更改的对象是字典,更改将是从中删除单个键。在我的情况下,复制旧字典或新字典都可以 - 我只是想确保不会发生不确定状态。

1 个答案:

答案 0 :(得分:3)

代码不仅会破坏解释器,因为它们在Python中放置了GIL(全局解释器锁)。 因此,您仍然会将复制的对象置于无限状态,但是由于GIL,其中的每个子对象本身都是一个完整的Python对象。 然而,哪些子对象最终会处于复制状态只是偶然的事。

如果正如你所说的那样,另一个线程将改变一个字典值,并且你的副本最终会以旧值或新值结束并不重要,那么就没有任何危险:Python确保了完整性无论如何都是字典对象。

如果您在复杂对象上有多个可能的并发更改,请使用手册lock确保您“看到”一个状态作为副本的状态。