概述
在 odoo 中可以用自带的cron实现后台执行的任务,这个cron基于多线程,任务需要事先定义好,而且执行的情况结果并没有管理记录,在一些异步任务量大、异步要求效率更高的场合其表现并不是很好,而且定义cron xml也是比较繁琐的事,这时可以用 task_queue 模块 https://github.com/oejia/task_queue 来承载,这是一个功能完整的Odoo通用异步任务队列模块,可追溯执行状态和执行结果的:便捷易用,特性全面,日志可查,状态及异常管理,既可以用简单的数据库方式处理异步任务,也支持企业级的 Celery 方案,同时还提供了事件系统来处理模型变更触发的任务。适合用于:
- 需要异步处理的耗时操作
- 需要延迟执行的任务
- 需要监听模型变更并触发操作的场景
- 需要分布式任务处理的企业级应用
模块的主要功能特性
异步任务处理系统
提供两种异步任务处理方式:
基于 Odoo 数据库的异步任务 (@AsyncDB)
基于 Celery 的异步任务 (@Async)
数据库异步任务特性
- 通过装饰器 @AsyncDB 快速将模型方法转为异步执行
- 支持延迟执行 (countdown 参数)
- 任务状态追踪 (PENDING、STARTED、SUCCESS、FAILURE 等)
- 失败任务可重试
- 通过 Odoo 的 cron 任务定时执行队列中的任务,没有额外的什么依赖,能很快捷地使用
Celery 异步任务特性
- 支持 Celery 任务队列
- 可配置多个队列
- 支持任务优先级
- 支持任务结果存储
- 支持任务追踪和重试
事件系统
- 支持监听模型的 create/write/unlink 事件
- 可以针对特定字段变化触发事件
- 支持多个订阅者订阅同一事件
- 支持自定义执行动作
- 事件执行记录追踪
包含的管理界面
- Task 管理界面
- Task Result 查看界面
- 事件配置界面
- 事件订阅管理界面
安全特性
- 完整的访问权限控制
- 任务执行记录追踪
- 异常处理和日志记录
快捷使用方法
- 安装此模块 task_queue
- 将需要异步执行的方法加上装饰器
from odoo.addons.task_queue.api import AysncDB @AysncDB() @api.model def func(self, a, b):
# 模型类方法 pass @AysncDB() def func1(self, a, b):
# 记录集方法 pass @AysncDB() @api.one def func2(self, a, b): # 单记录方法 pass @AsyncDB(countdown=10*60) @api.model def test_countdown(self): # 将延迟10分钟执行 _logger.info('>>> It is time to do')