Python threading:如何重复调用工作线程避免递归深度超限错误?
错误原因
你原有写法中递归调用run()方法会持续累积调用栈帧,Python默认最大递归深度约为1000层,按你设置的5秒执行一次计算,不到1.5小时就会触发RecursionError报错,完全不适合长期运行的监测场景。
优化实现方案
直接用while循环替代递归即可,同时适配wxPython的线程安全规则,修改后的代码如下:
import threading import time import wx class WorkerThread(threading.Thread): def __init__(self, window): super().__init__() self.window = window self.timeToQuit = threading.Event() # 设为守护线程,GUI关闭时自动跟随退出 self.daemon = True def stop(self): self.timeToQuit.set() def run(self): # 循环执行,无栈累积问题,支持长期运行 while not self.timeToQuit.is_set(): # 此处放置网页数据监测的业务逻辑 # 示例:若需要将数据更新到GUI界面,必须使用wx.CallAfter # page_data = 你的网页请求逻辑 # wx.CallAfter(self.window.update_display, page_data) # 等待5秒,收到停止信号时会直接中断等待,无需等满5秒 if self.timeToQuit.wait(5): break
注意事项
- 不要在工作线程中直接操作wxPython的界面控件,所有界面更新逻辑必须通过
wx.CallAfter()抛到主线程执行,否则会出现界面卡顿、崩溃等异常 - 关闭GUI窗口时可以主动调用线程的
stop()方法,实现线程的优雅退出 - 如果监测逻辑本身耗时较长,可以在每次循环结束后主动清理临时变量,避免内存占用持续升高
内容的提问来源于stack exchange,提问作者Leo_Liu
相关产品推荐
相关产品推荐

