Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长时间运行的Python线程意外退出_Python_Multithreading_Python 3.x_Python Multithreading - Fatal编程技术网

长时间运行的Python线程意外退出

长时间运行的Python线程意外退出,python,multithreading,python-3.x,python-multithreading,Python,Multithreading,Python 3.x,Python Multithreading,我正在开发一个python程序,该程序作为守护进程运行,并生成几个不同的长时间运行线程,这些线程可能具有独立的睡眠计时器 我遇到的问题是,在一段未知的时间后,线程正在消亡,我不完全确定为什么或如何诊断这些问题。我在类中添加了一个\uu del\uu函数(虽然不是最终的解决方案),作为线程运行,以查看可能出现的问题,但不确定有哪些变量可用于确定导致退出的原因 我还没有接近确定问题的原因,我希望能找到一些帮助 我的主运行程序(顶层守护进程)的一个片段是: threads = [] sensorFol

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

我遇到的问题是,在一段未知的时间后,线程正在消亡,我不完全确定为什么或如何诊断这些问题。我在类中添加了一个
\uu del\uu
函数(虽然不是最终的解决方案),作为线程运行,以查看可能出现的问题,但不确定有哪些变量可用于确定导致退出的原因

我还没有接近确定问题的原因,我希望能找到一些帮助

我的主运行程序(顶层守护进程)的一个片段是:

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请求,它不知道在哪里找到主机,并抛出异常。不幸的是,知道这一点,我仍然不确定如何最好地处理这些异常。

因此,我在这里只看到3种可能性:

  • 线程正在抛出一个异常,您没有看到或没有注意到stderr
  • 线程调用的某个对象正在调用sys.exit,这将只强制该线程停止
  • 如果使用了任何阻塞操作或锁,则可能是线程本身死锁或在某个io操作上无限期阻塞
  • 在上述任何情况下,添加一些线程转储锁定,如下所示:


    应该向您显示该线程上发生了什么(或者它是否消失了)。

    可能是未处理的异常。添加一些日志记录。在
    \uuu del\uu
    功能中,我可以打印堆栈跟踪吗?是的<代码>导入回溯。你也可以用try/catch(而不是del)来包装你的startCheckin代码,好吧,我会试试,看看会发生什么,它会消失一段时间……你不会得到任何东西打印的堆栈跟踪?我希望一个未处理的异常会引起一些噪音。此代码中是否有
    try/except
    块?内部
    检查传感器()
    检查传感器()
    ,等等。