Odoo 异步非阻塞任务

一、概述

  queue_job 是一个用于在 Odoo 中实现异步任务队列的模块,它能够帮助你处理长时间运行的任务(例如导入大量数据、生成报表等),并且可以在后台异步执行,而不会阻塞 Odoo 的主线程。使用 queue_job 可以显著提升 Odoo 系统的性能和响应速度。

    常见的使用场景包括:

  • 数据导入导出
  • 生成和发送报表
  • 批量处理操作
  • 定期任务调度

二、Demo

from odoo import models, fields, api
from odoo.addons.queue_job.job import job
import random

class DemoQueueJob(models.Model):
    _name = 'demo.queue.job'
    _description = 'Demo Queue Job'

    name = fields.Char('Job Name', default="Queue Job Demo")
    description = fields.Text('Description')

    @job(priority=10)  # priority 值越大优先级越高
    def my_async_method(self, arg1, arg2):
        """ 异步任务的实际执行方法 """
        print(f"开始处理异步任务:{self.name}, 参数: {arg1}, {arg2}")

        # 模拟一些长时间的操作
        if random.choice([True, False]):  # 随机模拟任务失败
            raise ValueError("模拟任务失败!")
        
        print(f"异步任务 {self.name} 完成.")
        return True

    def trigger_async_task(self):
        """ apply_async触发异步任务并加入队列。单独调用不会触发 """
        self.my_async_method.apply_async(args=('value1', 'value2'))

    def schedule_task(self):
        """ 定时调度任务,每小时执行一次 """
        self.my_async_method.apply_async(
            interval=3600,  # 每小时运行一次
            nextcall=fields.Datetime.now(),  # 从现在开始
            args=('scheduled', 'task')
        )

    def trigger_task_with_retry(self):
        """ 启动一个带有重试机制的任务 """
        try:
            self.my_async_method.apply_async(
                args=('fail', 'test'),  # 强制模拟失败
                max_retries=3  # 最大重试次数为 3。也可以在job中设置max_retries
            )
        except Exception as e:
            print(f"任务失败,错误信息:{e}")

demo2

from odoo import models, fields
from odoo.addons.queue_job.job import job
import random

class DemoQueueJob(models.Model):
    _name = 'demo.queue.job'
    _description = 'Demo Queue Job'

    name = fields.Char('Job Name', default="Queue Job Demo")
    description = fields.Text('Description')

    @job(max_retries=3, default_retry_delay=60)  # 设置最大重试次数和每次重试的延迟时间(单位:秒)
    def my_async_method(self, arg1, arg2):
        """ 异步任务的实际执行方法 """
        print(f"开始处理异步任务:{self.name}, 参数: {arg1}, {arg2}")

        # 模拟任务失败:故意触发异常以测试重试机制
        if random.choice([True, False]):  # 随机模拟任务失败
            print("任务失败,准备重试...")
            raise ValueError("模拟任务失败!")

        print(f"异步任务 {self.name} 完成.")
        return True

    def trigger_task_with_retry(self):
        """ 启动一个带有重试机制的任务 """
        self.my_async_method.apply_async(
            args=('fail', 'test')  # 强制模拟失败
        )

 

Odoo18之后的版本 

 1     # models.Model模型中自带with_delay来异步执行
 2     def __self_with_delay(self): 
 3         return self.with_delay(
 4             priority=10, # 优先级
 5             eta=datetime.now() + timedelta(microseconds=200),  # 延迟200毫秒执行
 6             max_retries=3, # 最大重试次数3
 7             description=f"3D模型解析【{self.file_md5}】",  # 描述
 8             channel=self._name,  # 通道
 9             identity_key=self.file_md5,  # 使用唯一标识符
10         )

 

posted @ 2024-12-30 12:54  看一百次夜空里的深蓝  阅读(86)  评论(0)    收藏  举报