2012-06-16 53 views
1

我有一个三线程的程序。我这样称呼他们:如何确保只有一个线程的实例在Python中运行?

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) 

财产以后但不知何故,它看起来并不像一个干净的解决方案,以我为程序可能已经退出,因为某些原因和线程可能不会启动的。

+0

你想让他们都运行,但你只想要一个运行? – cheeken

+0

我想保持这3个线程始终运行。但我也想确保t1,t2和t3每次只有一个实例正在运行。 –

+0

我不明白线程的实例是什么。所有线程基本相同,只是运行不同的代码。 – Gabe

回答

0

你是正确的一种方法,以确保线程只运行一次,每个将与锁文件。

怎么还有另一种方法来检查他们是否正在运行,而不是不断尝试运行它们。 通过使用下面的代码

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') 
+0

谢谢。我不知道有一个isALive()方法。我应该更好地检查手册。 –

相关问题