初始化
- 初始化中获取当前事件循环添加进 future
- 完成 mysql 初始化
- 建立 mongodb 索引
任务列表
- 基础任务:配置更新、日志记录、定时任务、消息处理、服务器运行
- 根据 PLATFORM_CONFIG 检测激活的平台
- 添加平台令牌刷新
- 添加平台初始化函数
- LR232
- 注册路由
- 检测网址联通性(默认开启了 LR232 即代表使用了域名)
- LR5821
- WECHAT
- BILI
并行运行
退出逻辑
- 退出时进行持久化数据的保存,将消息池、验证码等保存
- 任务退出时,main 里面 gather 的各子任务收到退出信号取消,不触发 except 模块,直接执行 finally 逻辑;同时,各子任务创建的 n
级子任务会先于一级子任务取消
- 每个任务取消前都会执行其 finally 逻辑
- 由于 await asyncio.Event().wait()、while True、queue.get()、asyncio.sleep() 等任务无法响应取消信号,故需要 main 里面设置退出信号,手动取消每个任务
- 退出后将持久化数据写入 storage.yaml
pytest(废弃)
- 使用 pytest 在开启 flask 或者其他长时间运行程序时,会出现 test 完成但主程序没有停止的情况,直接关闭命令行不会释放资源导致程序卡死
- pytest 的自带日志太多了,所以不采用 test
测试脚本(废弃)
- 使用测试脚本后,需要多执行一次
python test.py用于测试各平台连通性,比较复杂
- 直接采用配置判断+启动对应服务的形式即可
- 若服务器连接出现问题,在 command 容器日志中出现错误信息
- 若平台配置出现问题,在 lrobot 容器日志中出现错误信息
相关知识
- 进程、线程和协程
- 进程绕过全局解释器锁(GIL)实现真正的并行
- 线程通过通过操作系统调度实现并发
- 协程需要通过 await 来进行调度。如协程里写 while
- 对于高并发类型的io处理使用协程(数据库读取,future变量等待,request请求),对于cpu密集型使用线程(ai处理运算)
- 协程在await执行结束后,会到协程队列末尾重新执行
- asyncio.gather 当某个任务抛出异常后,如果没有 try 模块,则会终止一个任务,其他任务继续执行;若有,则会终止所有任务;当某个任务阻塞后,会阻塞所有任务的执行
- while True :await asyncio.sleep(1)这个是为了维持任务存在,但存在更好的方式来代替,如 condition;像看门狗使用 Event 参数一直挂起,则在协程中不占用时间,而在 observer 线程中进行管理