跳到主要内容

模块加载

  • 模块包管理器,自动更新模块

  • 开始时,由 logic 中的 __init__ 触发 logic/data/__init__ 和 logic/command/__init__ 里的 ModuleManager 实例

  • 初始化时加载目录路径,命名空间路径

  • 加载所有模块

    • 将模块加入命名空间
  • 开始监听路径中的文件变化

  • 存在变化

    • 模块在命名空间中
      • 触发重载模块
    • 模块不在命名空间中
      • 触发加载模块
  • git pull 因为没有更新文件只是增加更改项无法触发模块加载,在 git 中进行配置可在 git pull 时自行更新模块,详见此处

  • 动态更新最初采用 update 函数来更新模块
  • 使用该方法,修改 yaml 文件时可修改判断条件和引入函数
  • 但函数模块在导入后就不可修改了,是伪动态更新
  • 之后动态更新方法采用每次引用函数前手动卸载模块然后重载
  • 实现修改文件后可以动态更新效果
  • 然后修改 yaml 文件的部分移动到了 config 里
  • 最后优化成命名空间引用的形式,引用时只需要引用命名空间,命名空间用模块加载来自行维护其中的更新

热更新与 docker 重启冲突

  • 情况 1: msg.adapter 引用 logic.data 中的某函数,由于是静态引用,模块更新后无法触发修改
  • 情况 2: command.test 引用 command.base,更新 base 后,test 没有更新,导致其引用的 base 还是旧版的
  • 情况 3: config.py 更新,导致容器内的 config 更新,但所有引用 config 的模块没有检测到更新,因为都是静态引用
  • 在此类情况下,使用docker compose up --build -d lrobot,由于容器外部的文件更新已经传到了容器内,容器不会重启而是继续运行
  • 此时直接docker compose restart lrobot重启容器即可,不需要重构