首页 > 其他分享 >Odoo 异步非阻塞任务

Odoo 异步非阻塞任务

时间:2024-12-30 12:56:48浏览次数:1  
标签:异步 name self 阻塞 job 任务 Odoo async

一、概述

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

 

标签:异步,name,self,阻塞,job,任务,Odoo,async
From: https://www.cnblogs.com/watermeloncode/p/18640799

相关文章

  • 异步爬虫之aiohttp的使用
    在上一篇博客我们介绍了异步爬虫的基本原理和asyncio的基本用法,并且在最后简单提及了使用aiohttp实现网页爬取的过程。本篇博客我们介绍一下aiohttp的常见用法。基本介绍前面介绍的asyncio模块,其内部实现了对TCP、UDP、SSL协议的异步操作,但是对于HTTP请求来说,就......
  • 性能与一致性的平衡:深入解析同步与异步日志架构的最佳实践
    在分布式系统和高并发应用中,日志管理不仅是系统调试和故障排查的关键工具,也是性能监控、用户行为分析和安全审计的重要组成部分。然而,日志的记录和存储往往面临着性能与一致性之间的矛盾。在实际应用中,如何在保证系统性能的同时确保日志数据的一致性和完整性,成为架构设计中的......
  • spring boot @ansy 底层异步线程原理代码简要说明及代码示例
    在SpringBoot中,使用@Async注解可以非常方便地实现方法的异步调用。其底层是基于Spring的TaskExecutor实现的。以下是@Async异步线程原理的简要说明及代码示例。原理1.注解声明:在需要异步执行的方法上使用@Async注解。2.配置启用:在主类或配置类上启用异步支持,通过添加......
  • Odoo17 4模型计算字段:compute_sudo=True:在更高权限下执行计算
    在Odoo开发中,compute字段是一种强大的工具,用于动态计算字段的值。然而,有时你可能会遇到这样的情况:计算需要访问一些普通用户无法访问的数据,或者需要跨越访问控制。这时,compute_sudo=True标志就派上了用场。本文将详细介绍compute_sudo=True的含义、作用、应用场景......
  • 在js中如何实现顺序执行异步函数?
    在JavaScript中,有几种方法可以实现异步函数的顺序执行。以下是其中的一些方法:回调函数:这是最基本的实现异步操作顺序执行的方法。每个异步操作完成后,都会调用一个回调函数来执行下一个操作。但是,如果异步操作很多,这种方式会导致代码难以阅读和维护,通常被称为"回调地狱"。asyn......
  • Odoo QWeb 语法
    QWeb是Odoo的模板引擎,用于生成HTML页面和片段。它基于XML格式,允许在模板中使用特定的指令来动态生成内容。以下是QWeb的一些关键概念和语法,帮助你理解和使用它。一:简介QWeb是一种基于XML的模板引擎,用于生成HTML页面和片段。模板中的指令以 t- 开头。二:templ......
  • Flutter 异步编程简述
    1、isolate机制1.1基本使用Dart是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求,这种耗时操作会堵塞我们的代码。因此Dart也有并发机制——isolate。APP的启动入口main函数就是一个类似Android主线程的一个主isolate。与Java的Th......
  • odoo12环境搭建(linux系统)
    1.准备环境Centos7.6.1810:Postgresql12:Centos7下安装Postgresql12-CSDN博客python3.6.7:Centos7下搭建python3.6.7环境-CSDN博客odoo12:https://github.com/odoo/odoo/archive/refs/heads/12.0.zip2.odoo12环境配置odoo12源码解压,我放置在 /home/soft/odoo12路径下配......
  • 异步请求
    发送异步请求.通过jquery中的方法完成异步的请求。$.get(url,data,function(result){},type)$.post(url,data,function(result){},type)服务器返回的都是json数据。ssm后端返回的类型必须统一R.axios发送异步请求。因为jquery异步请求方式只有get和post模式,无法满足后台接......
  • 在同步方法里调用异步方法可能发生什么?
    在.NET中,如果你在一个同步方法中调用异步方法,可能会导致一些问题和潜在的性能瓶颈。以下是详细的解释和可能的情况:潜在的问题死锁(Deadlock):在同步方法中调用异步方法并使用Wait()或Result可能会导致死锁,特别是在使用SynchronizationContext的情况下(如在WindowsFo......