2012-06-16 80 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()方法。我應該更好地檢查手冊。 –

相關問題