昨天遇到一個問題 在一個python程序里面開了三個線程輪詢處理三件事情,剛開始一切正常,但是下午的時候發現其中一個線程死掉了,只剩下另外兩個線程在運行了,這時候也不想中斷主進程,又需要系統自動把死掉的一個線程啟動起來就想起了要做一個守護線程來監控三個工作線程是不是正常在工作。
查了一下手冊python線程Thread類提供了以下方法:
- run(): 用以表示線程活動的方法。
- start():啟動線程活動。
- join([time]): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的超時發生。
- isAlive(): 返回線程是否活動的。
- getName(): 返回線程名。
- setName(): 設置線程名。
這樣就可以在守護線程里面使用isAlive()方法判斷工作線程是否存活,如果死掉的話就重新建立一個工作線程,啟動起來(這里要注意不能使用原來的線程讓它start(),因為這個線程已經結束了,內存中的實例已經釋放掉了,所以使用這個方法會報錯)下面是監控的代碼
#coding=utf-8 import time from threading import Thread class ticker(Thread): def run(self): while True: print time.time() if (time.time() > 1470883000): break pass time.sleep(3) pass pass class moniter(Thread): def run(self): while True: global T if (T.isAlive()): print 't is alive' else : print 't is dead' T = ticker() T.start() print 'checking ' time.sleep(5) pass pass T = ticker() T.start() mo = moniter() mo.start()