arknights-mower icon indicating copy to clipboard operation
arknights-mower copied to clipboard

某些情况下陷入死循环通过重启解决(实施自动化异常处理和重置恢复策略提案)

Open lethefrost opened this issue 9 months ago • 0 comments

mower 当前的异常处理机制不是非常健壮,运行时间长了很容易走进各种 deadend。目前有蛮多情况会导致 mower 陷入死循环的,比方说永远卡在没能正确识别、或者没有预设处理逻辑的界面,或者计时线程出错整个 mower 直接永久休眠不再被定时任务唤醒运行。这种时候往往需要手动重启来恢复运作。

有时候挂着很长时间忘了看,偶然再打开 mower 和模拟器的时候会发现已经卡在某个界面好几个小时甚至几天了,体力早满了全员也注意力涣散了,这时候手动重启下也就算了,但有时候出个远门好长一段时间没法手动恢复,家里电脑上 mower 就一直卡在那里什么的就更麻烦了。因此我觉得如果能有个自动化的恢复机制会较有帮助。

存在大量各不相同的、会导致此类死循环的情景(见 #489 #488 #565 #574 等等,我自己还遇到过许多另外的比如意外进入并卡死在商店页、抽卡页、干员详情、编队页等),为每个错误场景人工一一添加处理逻辑可能还需要较长开发和等待周期,这里计划先做一个较为泛用的简易解决方案作为一个临时的 stopgap

  1. 重启明日方舟可以解决因为卡在无法识别/处理的页面所引起的死循环
  2. 重启 mower 任务线程可以解决由于任务安排导致的卡死

我目前关于实现这项功能的想法大概是这样:

设置项

  1. 是否启用暴力自修复程序 bool 默认否(无这个需求的用户默认保持和当前一致的体验)
  2. 检测间隔 int 单位分钟
  3. 异常容差 int 单位分钟
  4. 单轮工作时长上限 int 单位分钟

触发条件和重启逻辑

  • 初始化任务记录为空。
  • 每次休息结束开始工作的时候记录一个本轮开始的时间戳。
  • 每经过一次检测间隔的时长,触发一次检查
    1. 检查当前任务序列中的第一个任务,(处理被第一条任务无法完成所阻塞的情况,但是无法正确识别出多个任务构成的死循环)
      • 如果和之前记录中的任务相同,则重启 mower 工作线程;不管是否相同都清空记录。
      • 检查当前系统时间,如果已经超过当前第一个任务的定时+异常容差时长(防止卡退战斗 #575 ),则重启明日方舟,且记录下该任务。
    2. 检查本轮运行时长,如果超过单轮允许的上限则重启 mower (正常情况下运行通常一轮不会过久,这条用于应对卡进反复添加多条任务的循环无法结束的情况)

你们看这个可行吗?抛砖引玉了,大家有什么更好的意见请一起分享讨论!

我这阵子还有点其他事要忙,忙完之后开工搞这个,大家看看这个提的合不合理有没有其他人有需求的,做完之后要不要 merge 过来主仓库(以及有没有人有空顺便把这个做了啊,我想偷个懒(。)

lethefrost avatar May 01 '24 02:05 lethefrost