配置访问
- SafeDict 实现了字典的安全读写
- config['a']['b']使用 dict 的时候,如果 config 没有 a 键则会报错,使用 SafeDict 可以只返回空值而不报错
配置自动写入
- AutoConfig 实现了配置的载入与自动写入
- 载入时跳过 "_copy.yaml" 文件与"storage.yaml,agent.yaml",把文件中的键都载入 config 中,记录每个键的来源文件与每个文件的哈希值
- 当多个 yaml 存在相同的键值时,后面的会覆盖前面的
- 自动写入通过修改类写入方法实现,当配置更改时,通过读取该键的来源文件,将修改后的值添加并写入到来源文件中
临时存储
- AutoConfig 实现了临时存储
- 启动时,自动使用
storage = config.load()加载 storage.yaml 中的变量,包括令牌、消息池、验证码字典等
- 可通过
access_tokens = storage.setdefault("access_tokens",xx)来读取变量/设置为默认值
- 退出时,自动使用
config.save(storage)把 storage 写入 storage.yaml
- 该方法可以减少刷新次数(在频繁调试重启时保存各平台令牌)、保存撤回消息(维持消息池记录消息)、保持验证码
配置自动读取
- AutoConfigHandler 实现了配置的自动更新,在 config_watcher 函数中实例化
- linux 容器在外部更改同步到容器内部时不能触发 PollingObserver(),故使用 InotifyObserver()
- 通过监听 yml 文件夹中对应文件的变化,若文件哈希值改变则重新加载配置,达到配置更新的效果
- AutoConfig 和 AutoConfigHandler 没有写成一个类,是为了兼容不配置自动更新的、或者不需要异步事件循环的文件,config.py 中的配置可以挂载到任意容器中,并且直接引用
from config import config,若需要实时更改配置则 gather config_watcher 任务
- 由于保存机制(待研究),按 ctrl+s 后会触发两次 watchdog,所以需要文件哈希来减少读写次数