2016-04-08 75 views
0

如果由線程A複製的對象(使用python 2.7的複製庫中的deepcopy函數)由線程B同時更改,那麼預期會發生什麼?更改要複製的對象時的深度複製行爲

編輯: 要更改的對象是一個字典,更改將從中刪除一個單一的鍵。在我的情況下,複製舊字典或新字典都可以 - 我只是想確保那些不確定的狀態不會發生。

回答

3

代碼不僅會打破解釋器,因爲他們已經把Python中的GIL(全局解釋器鎖)放進去了。 因此,您仍然會將複製對象置於無限狀態,但是由於GIL,其中的每個子對象本身都是一個完整的Python對象。 但是,哪個子對象最終會處於複製狀態,這只是偶然事件。

如您所說,如果另一個線程將更改單個字典值,並且在您的副本最終以新值或新值結束時並不重要,則根本沒有危險:Python確保完整性任何情況下的字典對象。

如果對複雜對象有多個可能的併發更改,請使用手冊lock確保您「看到」的一個狀態爲副本的狀態。

+1

「這樣的代碼不好就是爲什麼他們必須把Python放在GIL中」 - 不,這裏有一個GIL,因爲解釋器本身有各種線程不安全的設計。 – user2357112

+0

是的 - 你說得對。但它讓人想到擴展GIL以使函數成爲原子,就像在javascript中一樣。無論如何,我應該改寫一下。 – jsbueno

+0

你是什麼意思'無限狀態'? – bsam