Python 创建一个';单身人士';线程-如何在任何时间最多有一个线程实例

Python 创建一个';单身人士';线程-如何在任何时间最多有一个线程实例,python,multithreading,singleton,Python,Multithreading,Singleton,我希望有一个类(从threading.Thread子类)在程序中从多个地方初始化和启动。我想要避免的是,如果线程已经从其他地方运行,如果程序中的另一个地方尝试启动它 t= somemodule.TheThread(some,args) t.start() 程序可以继续运行(但只有当同一线程尚未在此处或其他地方运行时,线程才会启动) 我可以想出一些不太优雅的方法来实现这一点,设置旗帜,但必须有一个很好的方法来处理这个问题。我研究了带有修饰符或重写new的单例类型模式,但主要问题是,如果我保留相同

我希望有一个类(从threading.Thread子类)在程序中从多个地方初始化和启动。我想要避免的是,如果线程已经从其他地方运行,如果程序中的另一个地方尝试启动它

t= somemodule.TheThread(some,args)
t.start()
程序可以继续运行(但只有当同一线程尚未在此处或其他地方运行时,线程才会启动)

我可以想出一些不太优雅的方法来实现这一点,设置旗帜,但必须有一个很好的方法来处理这个问题。我研究了带有修饰符或重写new的单例类型模式,但主要问题是,如果我保留相同的实例,即使线程已经完成,也不能(我知道)多次调用start

我曾考虑在另一个对象中创建线程对象,该对象可以检查当前线程是否仍在运行,但我无法确定如何确保该线程的安全


有人有什么想法吗?

您应该使用一个函数来创建和启动线程,该函数可以使用自己的簿记来了解线程是否已经启动。别忘了确保记账线的安全


试图让打电话的人相信他正在创建和启动一个线程,而他可能没有,这是一件非常麻烦的事情。在任何情况下,将此常见操作封装到函数中都是一个好主意,并为您提供所需的控制。

一种检查
某个模块是否活动的简单方法。线程
线程处于活动状态如下:

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

在应用程序启动时启动线程,并让它等待事件。如果设置了事件,线程将执行其工作,重置事件并再次等待。一旦其他线程通过设置事件“启动”循环线程,任何数量的其他线程都可以调用“set”,直到循环线程完成其工作、清除事件并再次等待为止

没有线程微管理,不可能有多个线程实例,没有线程不安全,没有标志,没有可疑的线程状态检查


在循环线程完成其工作和清除事件之间有一个小窗口,其中来自另一个线程的集合将被忽略。您选择的设计很难消除这种不确定性。您可以使用信号量而不是事件,并在顶部使用acquire(false)循环来检查信号量是否已发出信号,还可以确保其计数再次为零。如果信号量已发出信号,线程可以再次运行其工作。如果信号量尚未发出信号,则可以等待信号量发出

把它放在一个模块里怎么样?第一次调用import时,模块中的代码只运行一次。