pythonでスレッドを再起動させる
pythonでマルチスレッドを使っている時にスレッドがエラーで停止したときに再起動させて復活させる。
環境
python 3.5.2
プログラム
サブスレッドで÷0をして意図的にエラーをして、それをメインが監視して落ちていたら再起動
ここでは監視としてメインとスレッドの時間を比較して監視する
import threading, time global_lock = threading.Lock() # LOCK OBJECT global_time = 0 class sub_while(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): global global_time time_cnt=0 while True: global_lock.acquire() time_cnt = time_cnt+1 global_time = int(time.time()) global_lock.release() print("sub_thread:",int(time.time())) if(time_cnt >= 5): #error val = 100/0 time.sleep(1) if __name__ == "__main__": global global_time thread1 = sub_while() thread1.start() #再起動閾値時間 threshold_time =5 while True: print("main_time:",int(time.time())) print("diff_time:",int(time.time()) - global_time) global_lock.acquire() #スレッド監視 if(int(time.time()) - global_time > threshold_time): print("-- thread restart --") thread1 = sub_while() thread1.start() global_lock.release() time.sleep(1)
結果
sub_thread: 1543545253 main_time: 1543545253 diff_time: 0 main_time: 1543545254 sub_thread: 1543545254 diff_time: 0 main_time: 1543545255 sub_thread: 1543545255 diff_time: 0 main_time: 1543545256 sub_thread: 1543545256 diff_time: 0 main_time: 1543545257 diff_time: 0 sub_thread: 1543545257 Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner self.run() File "threadtest2.py", line 27, in run val = 100/0 ZeroDivisionError: division by zero main_time: 1543545258 diff_time: 1 main_time: 1543545259 diff_time: 2 main_time: 1543545260 diff_time: 3 main_time: 1543545261 diff_time: 4 main_time: 1543545262 diff_time: 5 main_time: 1543545263 diff_time: 6 -- thread restart -- sub_thread: 1543545263 main_time: 1543545264 diff_time: 0 sub_thread: 1543545264 main_time: 1543545265 diff_time: 1 sub_thread: 1543545265 main_time: 1543545266 diff_time: 1 sub_thread: 1543545266 main_time: 1543545267 diff_time: 1 sub_thread: 1543545267 Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner self.run() File "threadtest2.py", line 27, in run val = 100/0 ZeroDivisionError: division by zero main_time: 1543545268 diff_time: 1 main_time: 1543545269 diff_time: 2
以上。