2012-02-15 87 views
2

我正在尋找一個類(從threading.Thread中分類),它是從一個程序中的多個位置初始化並開始的。我想避免的是,如果線程已經從別的地方跑,如果計劃中的其他地方改掉啓動它創建一個'singleton'線程 - 如何在同一時間最多隻有一個線程實例

t= somemodule.TheThread(some,args) 
t.start() 

程序可以進行(但線程只啓動,如果在同一個線程ISN」已經在這裏或其他地方跑過了)。

我可以想到幾個不是很優雅的方法來設置標誌,但必須有一個很好的方式來處理這個問題。我用decorator查看單身人士類型模式或覆蓋,但主要問題是,如果我保持相同的實例是你不能(我知道)調用不止一次啓動,即使線程已完成。

我想過在另一個對象中創建線程對象,它可以檢查當前線程是否仍在運行,但我無法確定如何保持線程安全。

任何人有任何想法?

+0

如何將它保存在模塊中?第一次調用'import'時,模塊中的代碼將只運行一次。 – wim 2012-02-16 00:04:45

回答

6

您應該使用函數來創建和啓動線程,並且該函數可以使用自己的簿記來知道該線程是否已經啓動。不要忘記讓該簿記線程安全!

試圖讓調用者相信他正在創建並啓動一個線程,當他可能不是時,比其值得的更麻煩。在一個函數中封裝這個常用操作是一個好主意,並且可以讓你控制你正在尋找的東西。

0

一個簡單的方法來檢查,如果somemodule.TheThread線程處於活動狀態如下:

any(isinstance(thread, somemodule.TheThread) 
    for thread in threading.enumerate()) 
0

開始在應用程序啓動的線程,並把它等待的事件。如果事件被設置,則線程完成其工作,重置事件並再次等待。一旦其他線程通過設置事件「啓動」循環線程,任何數量的其他線程都可以調用「set」,直到循環線程完成其工作,清除事件並再次等待爲止。

沒有線程微管理,沒有可能存在超過一個線程實例,沒有線程不安全,沒有標誌,沒有可疑的線程狀態檢查。

循環線程完成其工作和清除其他線程的集合將被忽略的事件之間有一個小窗口。用您選擇的設計難以消除這種不確定性。您可以使用信號量而不是事件,並使用頂部的獲取(false)循環來檢查信號量是否已發出信號,並確保其計數再次爲零。如果信號已經發出信號,線程可以再次運行它的工作。如果信號沒有被髮信號,它可以等待直到它。

相關問題