2012-02-15 46 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)循环来检查信号量是否已发出信号,并确保其计数再次为零。如果信号已经发出信号,线程可以再次运行它的工作。如果信号没有被发信号,它可以等待直到它。

相关问题