具有长时间运行计时器的Python线程意外退出



我正在编写一个python程序,它作为守护进程运行,并生成几个不同的长时间运行线程,这些线程可能具有单独的睡眠计时器。

我遇到的问题是线程在未知时间后死亡,我不完全确定为什么或如何诊断问题。我去并添加(虽然不是最终的解决方案)一个__del__函数到类运行作为一个线程,看看可能是什么问题,但我不确定有什么变量可用于确定是什么导致退出发生。

我还不能确定问题的原因,我希望能找到一些帮助。

我的主要运行程序的一个片段,它是顶级守护进程:

threads = []
sensorFolders = glob.glob(config._baseDir + '28*')
for folder in sensorFolders:
    sensorID = os.path.split(folder)[1]
    sensor = Sensor().getSensor(sensorID)
    threads.append(threading.Thread(target=sensor.startCheckin))
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

和Sensor Class的片段:

def startCheckin(self):
    while True:
        self.checkSensor()
        self.checkinSensor()
        self.postTemp()
        time.sleep(self._checkinInterval)

我当然可以根据需要添加更多的代码,但它的实现是相当基本的。我只是不确定该在这里尝试什么,因为对于python新手来说,似乎没有什么明显的原因可能导致线程突然关闭。

任何帮助都将非常感激!

编辑问题似乎是,如果网络中断了一会儿,线程调用url请求,它不知道在哪里找到主机并抛出异常。不幸的是,知道了这一点,我仍然不确定如何最好地处理这些异常。

所以我只看到了三种可能性:

  1. 线程抛出异常,而你没有看到或没有注意到stderr
  2. 线程正在调用sys。退出,这将只强制该线程停止。
  3. 如果使用了阻塞操作或锁,则线程可能会死锁或无限期阻塞某些io操作。

添加一些线程转储锁,如下所示:

https://stackoverflow.com/a/2569696/3957645

应该显示该线程上正在发生的事情(或者它是否已经消失)。

最新更新