如何确保Python中只运行一个线程实例?

如何确保Python中只运行一个线程实例?,python,Python,我有一个有三个线程的程序。我这样称呼他们: if __name__ == "__main__": while True: try: t1().start() except: log.debug('Trouble with t1 synchronizer') try: t2().start() except: log.debug('

我有一个有三个线程的程序。我这样称呼他们:

if __name__ == "__main__":
    while True:
        try:
            t1().start()
        except:
            log.debug('Trouble with t1 synchronizer')
        try:
            t2().start()
        except:
            log.debug('Trouble with t2 synchronizer')
        try:
            t3().start()
        except:
            log.debug('Trouble with t3 synchronizer')

我想让这3个线程一直运行。但我还要确保t1、t2和t3一次只运行一个实例

编辑

我能想到的唯一解决方案是在每个线程中都有锁文件。糟糕的

if os.path.exists(lockfile):
   EXIT THREAD
f=open(lockfile,'w')
f.write('lock')
f.close()
THREAD_STUFF
os.remove(lockfile)

但不知何故,它看起来不像是一个干净的解决方案,因为程序可能因为某种原因退出,线程可能根本不会启动。

确保线程只运行一次的方法是正确的,每个线程都有一个锁文件

然而,有另一种方法可以检查它们是否正在运行,而不是不断尝试运行它们。 通过使用以下代码

if __name__ == "__main__":
    try:
        t1().start()
    except:
        log.debug('Trouble with t1 synchronizer')
    try:
        t2().start()
    except:
        log.debug('Trouble with t2 synchronizer')
    try:
        t3().start()
    except:
        log.debug('Trouble with t3 synchronizer')
    Time.sleep(5)
# this sleep allows the threads to start so they will return a True for isAlive()
    while True:
        try:
            if t1().isAlive()==False:
                try:
                    t1().start()
                except:
                    log.debug('Trouble with t1 synchronizer')
            if t2.isAlive()==False:
                try:
                    t2().start()
                except:
                    log.debug('Trouble with t2 synchronizer')
            if t2.isAlive()==False()
               try:
                    t3().start()
                except:
                    log.debug('Trouble with t3 synchronizer')

你想让它们都运行,但你只想让一个运行?我想让这3个线程一直运行。但我还想确保t1、t2和t3一次只运行一个实例,我不知道线程的实例是什么。所有线程本质上是相同的,它们只是运行不同的代码。@gabe我可能使用了错误的术语。我不希望t1一次运行超过一次。t2和t3也一样。谢谢。我不知道有一个isALive()方法。我应该更好地检查手册。