是obj in a_list
線程安全,而a_list
可能在不同的線程被修改?python的「in」語言是否構造線程安全的列表?
Here's a comprehensive yet non-exhaustive list of examples的list
操作以及它們是否線程安全,但我找不到in
語言結構的任何參考。
就python實現而言,我使用CPython,但是其他實現的答案對於社區也是有幫助的。
是obj in a_list
線程安全,而a_list
可能在不同的線程被修改?python的「in」語言是否構造線程安全的列表?
Here's a comprehensive yet non-exhaustive list of examples的list
操作以及它們是否線程安全,但我找不到in
語言結構的任何參考。
就python實現而言,我使用CPython,但是其他實現的答案對於社區也是有幫助的。
我假設你在這裏使用CPython。
提供沒有定製__contains__
或__iter__
鉤在滴回成Python 或您測試值針對包含列表使用Python代碼實現的自定義__eq__
鉤,所述in
操作者可完全用C處理,並且只是一個操作碼。
這使得操作完全是線程安全的; Python線程僅在操作碼之間切換; GIL(全局解釋器鎖)通常只在操作碼之間解鎖。
也就是說,如果您在自定義C類型上使用in
來解鎖GIL,那麼測試遏制將不是線程安全的。
在換言之:in
字節碼測試被鎖定,但如果操作者需要調用Python代碼(通過__contains__
,與__iter__
迭代時沒有__contains__
實現可用,或值是針對用Python實現__eq__
鉤檢驗) ,那麼操作不是線程安全的。
對於其他Python實現,處理線程的方式可能差異很大。當然,Jython和IronPython沒有GIL,並且您應該假設操作是而不是線程安全。
's/Python/CPython/g' – delnan
請注意,有關線程安全的任何聲明都是特定於實現的(也可能是版本特定的)。除了獲取和釋放鎖之外,假設沒有什麼是線程安全的可能更容易。 – delnan