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

时间:2014-08-12 03:09:10

标签: python multithreading python-3.x python-multithreading

我正在开发一个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()

传感器类的一部分:

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

我当然可以根据需要添加更多代码,但它在实现中是相当基础的。我只是不确定在这里尝试什么,因为没有出现(对于一个python noob)任何明显可能导致线程突然关闭的东西。

非常感谢任何帮助!

修改 问题似乎是如果网络暂停一段时间,并且线程调用了url请求,它就不知道在哪里找到主机并抛出异常。不幸的是,我知道这仍然不确定如何最好地处理这些例外。

1 个答案:

答案 0 :(得分:0)

所以我在这里只看到3种可能性:

  1. 线程正在抛出异常,而您没有注意到或者没有注意到stderr
  2. 线程调用的东西是调用sys.exit,这将强制只停止该线程。
  3. 如果使用了任何阻塞操作或锁,则可能是线程本身死锁或无限期地阻塞某些操作。
  4. 在任何这些情况下添加一些线程转储锁定如下:

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

    应该显示该线程上发生了什么(或者如果它消失了)。