2013-11-01 37 views
8

obj in a_list線程安全,而a_list可能在不同的線程被修改?python的「in」語言是否構造線程安全的列表?

Here's a comprehensive yet non-exhaustive list of exampleslist操作以及它們是否線程安全,但我找不到in語言結構的任何參考。

就python實現而言,我使用CPython,但是其他實現的答案對於社區也是有幫助的。

+6

請注意,有關線程安全的任何聲明都是特定於實現的(也可能是版本特定的)。除了獲取和釋放鎖之外,假設沒有什麼是線程安全的可能更容易。 – delnan

回答

15

我假設你在這裏使用CPython。

提供沒有定製__contains____iter__鉤在滴回成Python 您測試值針對包含列表使用Python代碼實現的自定義__eq__鉤,所述in操作者可完全用C處理,並且只是一個操作碼。

這使得操作完全是線程安全的; Python線程僅在操作碼之間切換; GIL(全局解釋器鎖)通常只在操作碼之間解鎖。

也就是說,如果您在自定義C類型上使用in來解鎖GIL,那麼測試遏制將不是線程安全的。

在換言之:in字節碼測試被鎖定,但如果操作者需要調用Python代碼(通過__contains__,與__iter__迭代時沒有__contains__實現可用,或值是針對用Python實現__eq__鉤檢驗) ,那麼操作不是線程安全的。

對於其他Python實現,處理線程的方式可能差異很大。當然,Jython和IronPython沒有GIL,並且您應該假設操作是而不是線程安全。

+0

's/Python/CPython/g' – delnan