1 回答

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
CPython 保證它自己的數(shù)據(jù)結(jié)構(gòu)是線程安全的,不會(huì)損壞。這并不意味著任何自定義數(shù)據(jù)結(jié)構(gòu)或代碼都是無(wú)競(jìng)爭(zhēng)的。
GIL 的目的是保護(hù) CPython 的數(shù)據(jù)結(jié)構(gòu)免受損壞。人們可以相信內(nèi)部狀態(tài)是線程安全的。
全局解釋器鎖(Python 文檔 – 詞匯表)
CPython 解釋器用于確保一次只有一個(gè)線程執(zhí)行 Python 字節(jié)碼的機(jī)制。這通過(guò)使對(duì)象模型(包括關(guān)鍵的內(nèi)置類型,如 dict)對(duì)并發(fā)訪問(wèn)隱式安全來(lái)簡(jiǎn)化 CPython 實(shí)現(xiàn)。[...]
這也意味著跨線程更改的正確可見性。
然而,這并不意味著任何孤立的語(yǔ)句或表達(dá)式都是原子的:幾乎任何語(yǔ)句或表達(dá)式都可以調(diào)用多個(gè)字節(jié)碼指令。因此,GIL 明確不為這些情況提供原子性。
具體來(lái)說(shuō),一條語(yǔ)句x.a=bar
可以通過(guò)調(diào)用 setterobject.__setattr__
或描述符協(xié)議來(lái)執(zhí)行任意多條字節(jié)碼指令。它至少執(zhí)行三個(gè)字節(jié)碼指令,用于bar
查找、x
查找和a
賦值。
因此,Python保證可見性/一致性,但不提供針對(duì)競(jìng)爭(zhēng)條件的保證。如果一個(gè)對(duì)象同時(shí)發(fā)生變化,則必須對(duì)其進(jìn)行同步以確保正確性。
添加回答
舉報(bào)