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')  # 强制模拟失败
        )
复制代码

 

posted @   看一百次夜空里的深蓝  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-12-30 Python OpenCV 去除截图中的所有图片
2023-12-30 Python OpenCV 截取图片中的小图片
点击右上角即可分享
微信分享提示