odoo开发笔记 -- 借助模块queue_job实现异步方法调用
场景描述:
对比了几个定时调度的框架,发现各有优缺点;
celery 很强,异步定时调度,异步周期调度,也有延时调度的功能,但是延时调度的案例比较少,遂暂时不使用。
queue_job,一个odoo第三方应用模块,同样功能强大,可以满足日常的异步方法执行;
模块github地址:https://github.com/OCA/queue/tree/10.0/queue_job
但是我们的场景稍微有些不同,就是需要在异步调用的基础上增加一个延时(例5秒);
一般的异步调度机制:异步执行避免了任务的阻塞,相当于将需要下一步执行的任务(函数or方法),添加到了一个待执行的队列中,然后交给后台程序去慢慢处理,
处理的速度及性能,取决于服务器的硬件配置以及给相应任务开辟的进程数量。
回到我们的需求,通过分析queue_job模块的代码,大概找到我们需要定制修改的位置,即:在job开始执行前增加一个延时,下图为未修改之前:
修改后代码:
注意:这样虽然可以满足需求,但是会有新的问题,造成系统走到这里需要等待5秒时间,
实际生产环境,修改后,需要观察性能,如果处理效率满足不了实际情况,可以考虑适当增加服务器CPU配置,以及配置文件中的worker数,即多开辟进程。
顺便分享下,模块queue_job的基本使用及配置。
1. 模块介绍
2. 下载--根据自己odoo实际版本下载
第三方市场:https://www.odoo.com/apps/modules/10.0/queue_job/
github: https://github.com/OCA/queue/tree/10.0/queue_job
3. 配置
This addon adds an integrated Job Queue to Odoo. It allows to postpone method calls executed asynchronously. Jobs are executed in the background by a Jobrunner, in their own transaction. Example: from odoo import models, fields, api
from odoo.addons.queue_job.job import job class MyModel(models.Model):
_name = 'my.model' @api.multi
@job
def my_method(self, a, k=None):
_logger.info('executed with a: %s and k: %s', a, k) class MyOtherModel(models.Model):
_name = 'my.other.model' @api.multi
def button_do_stuff(self):
self.env['my.model'].with_delay().my_method('a', k=2)
In the snippet of code above, when we call button_do_stuff, a job capturing the method and arguments will be postponed. It will be executed as soon as the Jobrunner has a free bucket, which can be instantaneous if no other job is running. Features: Views for jobs, jobs are stored in PostgreSQL
Jobrunner: execute the jobs, highly efficient thanks to PostgreSQL's NOTIFY
Channels: give a capacity for the root channel and its sub-channels and segregate jobs in them. Allow for instance to restrict heavy jobs to be executed one at a time while little ones are executed 4 at a times.
Retries: Ability to retry jobs by raising a type of exception
Retry Pattern: the 3 first tries, retry after 10 seconds, the 5 next tries, retry after 1 minutes, ...
Job properties: priorities, estimated time of arrival (ETA), custom description, number of retries
Related Actions: link an action on the job view, such as open the record concerned by the job
Table of contents Installation
Configuration
Usage
Developers
Known issues / Roadmap
Changelog
Next
10.0.1.0.0
Bug Tracker
Credits
Authors
Contributors
Maintainers
Installation
Be sure to have the requests library. Configuration
Using environment variables and command line:
Adjust environment variables (optional):
ODOO_QUEUE_JOB_CHANNELS=root:4 or any other channels configuration. The default is root:1
if xmlrpc_port is not set: ODOO_QUEUE_JOB_PORT=8069
Start Odoo with --load=web,web_kanban,queue_job and --workers greater than 1. [1]
Using the Odoo configuration file:
[options]
(...)
workers = 6
server_wide_modules = web,queue_job (...)
[queue_job]
channels = root:2
Confirm the runner is starting correctly by checking the odoo log file:
...INFO...queue_job.jobrunner.runner: starting
...INFO...queue_job.jobrunner.runner: initializing database connections
...INFO...queue_job.jobrunner.runner: queue job runner ready for db <dbname>
...INFO...queue_job.jobrunner.runner: database connections ready
Create jobs (eg using base_import_async) and observe they start immediately and in parallel.
Tip: to enable debug logging for the queue job, use --log-handler=odoo.addons.queue_job:DEBUG
[1] It works with the threaded Odoo server too, although this way of running Odoo is obviously not for production purposes.
Usage
To use this module, you need to: Go to Job Queue menu
Developers
Bypass jobs on running Odoo When you are developing (ie: connector modules) you might want to bypass the queue job and run your code immediately. To do so you can set TEST_QUEUE_JOB_NO_DELAY=1 in your enviroment. Bypass jobs in tests When writing tests on job-related methods is always tricky to deal with delayed recordsets. To make your testing life easier you can set test_queue_job_no_delay=True in the context. Tip: you can do this at test case level like this @classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(
cls.env.context,
test_queue_job_no_delay=True, # no jobs thanks
))
Then all your tests execute the job methods synchronously without delaying any jobs.
官方说明
先配置odoo配置文件:
在odoo.conf中增加如下:
4. 使用
5. 查看结果
odoo开发笔记 -- 借助模块queue_job实现异步方法调用的更多相关文章
- odoo开发笔记--一个模块显示两个一级菜单
场景描述: 在已启动开发的模块中,odoo顶部一级菜单只有一个“会员管理”,需求是:在同一级顶部菜单,增加新菜单“产品管理”.举例如图: 处理方式: 按照odoo的机制,实现这种效果,可以 ...
- odoo开发笔记 -- 升级模块 提示外部ID找不到
可能的原因: 排查顺序: 1.id在视图中的加载顺序问题. 可能是:__manifest__.py文件,view文件先后加载顺序有问题:也可能是:xml 视图文件中,被引用的id出现在了引用id的下方 ...
- odoo开发笔记 -- 官方模块一览表
模块名称 技术名称 作者 电子发票管理 account OpenERP SA 会计与财务 account_accountant OpenERP SA 合同管理 account_analytic_ana ...
- odoo开发笔记 -- 新建模块扩展原模块增加菜单示例
场景描述: 1. 扩展了新模块 2.想要
- odoo开发笔记 -- div标签代替odoo button写法
odoo开发笔记 -- div标签代替odoo button写法 并调用自定义js <footer> <div id="confirm_request_cloud_repo ...
- odoo开发笔记 -- 搜索视图继承扩展
odoo开发笔记 -- 搜索视图继承扩展
- odoo开发笔记 -- 后台日志输出及分析
odoo开发笔记 -- 后台日志输出及分析 附:日志分析软件
- odoo开发笔记 -- 附件上传
附件上传基本原理实现,可以参考这篇: https://www.cnblogs.com/ljwTiey/p/7348291.html http://blog.csdn.net/wangnan537/ar ...
- odoo开发笔记 -- 用户配置界面如何增加模块访问权限
在odoo设置界面,点击用户,进入用户配置界面,会看到: 访问权 | 个人资料菜单 在访问权 page菜单界面,可以看到系统预制的一些模块都会显示在这里, 那么,我们自己开发的模块如何显示在这块呢,从 ...
随机推荐
- NumPy 之 案例(随机漫步)
import numpy as np The numpy.random module supplements(补充) the built-in Python random with functions ...
- 浅谈Python设计模式 - 外观模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...
- Layout POJ - 3169
题目链接:https://vjudge.net/problem/POJ-3169 题意:有一些奶牛,有些奶牛相互喜欢,他们之间的距离必须小于等于一个K. 有些奶牛相互讨厌,他们之间的距离必须大于等于一 ...
- linux lvm管理基础教程
linux lvm管理基础教程 本人是在redhat7.x系统上亲测lvm管理功能,至于文中所受的CentOS 6 没有亲自试过. 本文来自:https://geekpeek.net/lvm-phys ...
- Android AMS服务
继续来研究Android Framework层相关的一些东东,这里是以Android8.0版本的源码进行梳理的,关注的还是其核心流程,不是彻底分析,了解了核心流程是为了了期其大概的原理. Androi ...
- rhel6.2配置在线yum源
由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源. 本文包括配置本地源及第三方源.第三方源包括:网易,epel, ...
- 推荐系统(recommender systems):均值归一化(mean normalization)
均值归一化可以让算法运行得更好. 现在考虑这样一个情况:一个用户对所有的电影都没有评分,即上图所示 的Eve用户.现在我们要学习特征向量(假设n=2) 以及用户5的向量θ(5),因为用户Eve没有对任 ...
- 常用方法 DataTable转换为Html
点击单元格 可以输出行和列,这个功能可以在一些特殊的地方用 public static string GetHtmlString(DataTable dt) { StringBuilder sb = ...
- Python 11 提取括号中间的内容
原文:https://blog.csdn.net/your_answer/article/details/80456550 import re string = 'abe(ac)ad)' p1 = r ...
- qwq。。胡诌qwq
1,十里寒塘,红楼灯火阑珊,晓风残月,思念醒了一半. 晨钟催落月,淑气催黄鸟,而花千树而你还未还,三月烟花,只剩远影孤帆,珠箔飘灯,大雁独自来返,柳絮铺地,桃花落了菀晚, 琴声弹起,雨落长安,长夜漫漫 ...