posts - 206, comments - 61, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
监视主线程卡死,发现时进行处理,例如保错再主动崩溃退出,这样再结合监视崩溃自动重启就可以在卡死时实现自动重启。

import threading
import time
import sys
import os


class WatchDog(threading.Thread):

    def __init__(self, timeout=10, echo=False):
        super(WatchDog, self).__init__()
        self.timeout = timeout
        self.echo = echo
        self.last_kicked_ts = time.time()
        self.lock = threading.Lock()
        self.setDaemon(True)
        self.start()

    def kick(self):
        self.lock.acquire()
        self.last_kicked_ts = time.time()
        self.lock.release()

    def bark(self):
        if self.echo:
            print("!!!!! WATCH DOG FAILURE TRIGGERED !!!!!")
        pid = os.getpid()
        os.kill(pid, 2) # 通知进程退出
        time.sleep(5)   # 等待5秒
        os.kill(pid, 9) # 发送强制退出

    def run(self):
        while True:
            ts = time.time()
            if ts - self.last_kicked_ts > self.timeout:
                self.bark()
            if self.echo:
                print(f"Successful dog check [ts] {ts:.3f} [last_kicked_ts] {self.last_kicked_ts:.3f}")
            n = max(self.timeout / 3, 1)
            time.sleep(n)


用法:

dog = WatchDog(echo=True)
while True:
    consumer.workex(timeout_ms=100)
    dog.kick()
只有注册用户登录后才能发表评论。