我正在编写一个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请求,它不知道在哪里找到主机并抛出异常。不幸的是,知道了这一点,我仍然不确定如何最好地处理这些异常。
所以我只看到了三种可能性:
- 线程抛出异常,而你没有看到或没有注意到stderr
- 线程正在调用sys。退出,这将只强制该线程停止。
- 如果使用了阻塞操作或锁,则线程可能会死锁或无限期阻塞某些io操作。
添加一些线程转储锁,如下所示:
https://stackoverflow.com/a/2569696/3957645应该显示该线程上正在发生的事情(或者它是否已经消失)。