插件出错的时候
插件崩了不等于人格崩了:后台任务崩了宿主按退避重启,一次点击出错只影响这一次,启用到一半失败就全部撤掉。每个插件的健康和最近一次出的错,后台都看得到。
几种情况
- 后台任务崩了(
context.spawn起的):按 1 秒、5 秒、15 秒、1 分钟、5 分钟退避重启,插件标成「降级」。 - 处理一次点击、一条命令出错:只影响这一次,记进「最近一次出错」。
- 钩子出错、超时:记日志,这一轮当它没回,人格照常往下走(3.9)。
- 启用到一半出错:已经注册的命令、任务全部撤掉,标成「失败」,原因写在插件页面。
- 停用时后台任务不肯退出:最多等 10 秒,然后不再等它。
看健康
网页后台「插件中心」每个已装的插件下面有:是否已启用、这个进程里是否已加载、健康(正常、降级、失败……)、最近一次出错。桌面版「插件」页也看得到正常不正常。
「已启用」是记下来的状态,不等于此刻真的在跑;「已加载」才是 setup 成功了。两者可能不一样,以健康为准。
重载、停用、卸载
- 重载:改了插件的代码或配置,重新 setup 一次。
- 停用:调
teardown()、停掉后台任务、撤掉注册的命令;配置和数据留着。 - 卸载:插件自己的数据和配置默认留着,重装回来还在;要连数据一起清,接口上带
purge_data=true。
对应的代码
- 托管任务和退避:
src/aeria/plugins.py的PluginManager.spawn;出错记录:record_plugin_error;健康:health_report、PluginHealth。 - 卸载:
DELETE /api/plugins/<插件编号>(src/aeria/webui.py)。 - 测试:
tests/test_4_1_plugin_host.py。
没做到的
- 一个插件吃满 CPU、卡住事件循环,宿主拦不住(没有进程隔离)。
- 健康只看「崩没崩」,不看插件有没有在干它该干的活。