[英]Are Python global variables thread-safe?
編輯:我問全局變量在龍卷風這樣的單線程Web框架中是否安全
即時通訊使用mongoengine orm,它從全局變量獲取數據庫連接:
_get_db() # gets the db connection
我還使用了龍卷風,一個單線程的python網絡框架。 在一個特定的視圖中,我需要獲取數據庫連接並取消引用DBRef
對象(類似於外鍵):
# dereference a DBRef
_get_db().dereference(some_db_ref)
由於_get_db
返回的連接是全局_get_db
,是否有可能發生沖突並且將錯誤的值返回到錯誤的線程?
與Python對象進行交互時,始終需要線程來保持GIL。 擁有變量的名稱空間是一個Python對象(可以是frameobject或dict,具體取決於變量的類型。)在多個線程中獲取或設置變量始終是安全的。 您將永遠不會獲得垃圾數據。
但是,通常的競爭條件確實適用於獲得的對象或分配時替換的對象。 x += 1
類的語句不是線程安全的,因為在get和store之間可以運行不同的線程,從而更改x
的值,然后將其覆蓋。
假設MongoEngine正在包裝PyMongo(我相信是),那么您應該沒問題。 PyMongo是完全線程安全的。
不,但是鎖很容易在python中使用。 使用try:finally:模式來確保在修改全局變量后釋放了鎖。
關於全局變量,沒有什么比其他變量具有更多或更少的線程安全性了。 在不同的線程中運行時,操作是否有可能失敗或返回錯誤的結果,最佳實踐是應保護線程之間共享的數據。
如果我沒看錯,您是在問變量在單線程環境中是否安全。 在這種情況下,在並發進程之間不共享數據的情況下,該變量是安全的(畢竟,沒有其他運行可能會中斷該變量)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.