簡體   English   中英

Python全局變量是線程安全的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM