You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:15:00