2011-10-11 56 views
1

我想用我正在寫的orm創建一個金字塔應用程序(目前處於深度字母狀態)。我想將orm插入到應用程序中,因此我想知道在多線程中如何處理全局對象。在線程中如何處理全局對象?

在文件: https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py 你可以看到,有一個全局對象調用CTX其中包含了默認的會話。如果我在入口處的中間件中運行set_context()和start_session()會怎麼樣?那麼我可以期待在每個線程中都有一個單獨的ctx會話嗎?或者有兩個線程會使用同一會話的風險?

+2

對於這個問題的後代來說,如果你可以將代碼粘貼到你的問題中,而不是鏈接到你的「主」分支,而這個分支很可能會在有人來讀時改變。 –

+0

@MichaelMerickel - 你是對的 - 這不是一個好主意。但我仍然認爲充分提供更好的看法。所以我編輯我的帖子並鏈接到標籤而不是主分支。 – zefciu

回答

2

全局變量在所有線程之間共享,所以如果你運行這些函數,線程將以不可預知的方式相互衝突。

要做你想做的事,你可以使用線程本地數據,使用threading.local。您需要刪除全局定義ctx,然後創建以下功能。

def get_ctx(): 
    thread_data = threading.local() 
    if not hasattr(thread_data, "ctx"): 
     thread_data.ctx = Ctx() 
    return thread_data.ctx 

然後,你到處引用ctx電話get_ctx()來代替。這將確保您的上下文不會在線程之間共享。

+0

您的方法無效。每次調用get_ctx()都會返回一個新對象。但是你指出了一個好方法。我所做的是從threading.local派生我的Ctx類。這樣它就能按預期工作。所以我接受你的答覆作爲一個好的觀點。 – zefciu

相關問題