Skip to content

[优化建议] 修复任务调度死锁、失败状态误报与 Session 重建问题 #618

Description

@liuwanwan1

问题背景

在复核当前 main、现有 issue 以及任务执行链路时,发现除已报告的单点问题外,还存在一组会共同影响无人值守运行可靠性的缺陷:

  1. 未开放章节的重试次数没有正确递增,可能持续重新入队,对应 [BUG反馈]重复判断未开放章节“该章节未开放” #612 的重复日志现象。
  2. worker 处理章节时若抛出异常,队列 accounting 可能无法完成,主线程会永久等待。
  3. 显式指定课程 ID 但没有匹配项时,旧逻辑会退化为处理全部课程,存在误操作风险。
  4. 章节 HTTP 异常、登录页、空解析、直播提交失败和重试耗尽等结果没有完整向上传播,最终仍可能提示“所有课程学习任务已完成”。
  5. SessionManager.get_session() 会重复初始化 requests.Session,运行过程中更新的 Cookie 和连接池可能丢失。
  6. 调度器依赖 Python 3.13 的 Queue.shutdown(),与项目原有 Python 3.10+ 使用场景不兼容,对应 [BUG反馈] 无法从queue中导入ShutDown #541

这些问题通常不会表现为单一堆栈错误,而会表现为任务卡死、重复执行、选课范围扩大或失败误报成功。

建议方案

  • 使用明确的剩余任务计数和条件变量管理 worker 生命周期,并确保异常路径也会完成本次任务 accounting。
  • 为未开放章节和普通失败设置有界重试,耗尽后返回失败状态。
  • 将章节、课程和主程序的执行结果逐层汇总,存在未完成任务时不得发送成功通知。
  • 显式课程列表无匹配项时直接中止;仅在用户明确输入 * 时选择全部课程。
  • 在进程内稳定复用同一个 Session,保留 Cookie 和连接池。
  • 移除 Python 3.13 专属 API,恢复 Python 3.10+ 兼容性。
  • 为队列异常、课程筛选、直播失败、Session 生命周期和失败传播增加离线回归测试。

相关问题

我已基于上述方案整理了一份实现,并完成 Python 3.10、Python 3.13、Ruff、PyInstaller 和 Windows 构建验证,将另行提交 PR 供维护者审阅。

暂不纳入本次修复的内容

#597#568 以及验证码相关问题仍缺少可稳定复现的脱敏 HTML/JSON 样例。本次不会通过猜测平台响应字段来判断完成状态,建议后续先补充 fixture,再实现三态解析和请求重放。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions