odoo12 修行提升篇之 异步定时任务 (一)

最近还有点时间,开始odoo12的提升篇吧。

提升篇可能不会很集中的写,断断续续的,知识点也比较零碎,可以当工具来查看了。

目前,我主要在用springboot做平台项目,odoo项目只是维护了。

基础篇和提升篇是我一年前就想写的,现在开始,也算是不忘初心了。

废话少说,开搞:

关于异步,使用了asyncio库、async、await,可以好好研究研究,对于提高代码质量有很大的帮助。下面是我个人的理解,只是想抛砖引玉。

async:

  可以将方法标记为异步方法,作用是方法可以被挂起。

await:

  用于标记异步方法内的耗时操作,挂起后可以跳出当前函数去执行其它异步函数,耗时操作结束了,再跳回来继续执行。一个函数内可以有多个await标记。如果不写await,就表示要方法执行完才会执行其它方法。

开始说一下odoo的定时任务:

需要两步:定义需要执行的定时任务方法;定义定时任务的规则。

1、在models目录下创建my_schedule.py文件,终于用上抽象模型了,在init.py中引入:

# -*- coding:utf-8 -*-

from odoo import models, fields

import asyncio


class MySchedule(models.AbstractModel):
    _name = 'my.schedule'
    _description = '定时任务'

    def schedule(self):
        start_time = fields.datetime.now()
        asyncio.run(self.do_schedule_list())
        end_time = fields.datetime.now()
        print('cost time =>', end_time - start_time)

    # 任务列表,可能有多个定时任务需要执行,每个任务前加await
    async def do_schedule_list(self):
        await self.statistics_compute_sum_nums()

    # 具体的定时任务,这里是求和任务,1-100的和
    async def statistics_compute_sum_nums(self):
        # 定义异步方法列表,有三个异步任务
        tasks = [
            asyncio.create_task(self._compute_sum_nums(1, 30)),
            asyncio.create_task(self._compute_sum_nums(30, 60)),
            asyncio.create_task(self._compute_sum_nums(60, 101))
        ]
        # gather会异步执行任务,并返回所有任务完成后的结果
        result = await asyncio.gather(*tasks)
        print('result=>', result, 'sum=>', sum(result), 'time=>', fields.datetime.now())

    # 耗时方法
    async def _compute_sum_nums(self, start, end):
        await asyncio.sleep(2)
        return sum(range(start, end))

2、在views目录下,新建my_schedule.xml文件,在__manifest__.py中引入:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>

    <record id="schedule_statistic_num_sum" model="ir.cron">
        <field name="name">数据统计任务</field>
        <field name="model_id" ref="model_my_schedule"/>
        <field name="state">code</field>
        <field name="code">model.schedule()</field>
        <field name="interval_number">1</field>
        <field name="interval_type">minutes</field>
        <field name="numbercall">-1</field>
        <field eval="True" name="doall"/>
        <field name="user_id" ref="base.user_root"/>
    </record>

</odoo>

name: 定时任务的名称

model_id: 引用模型的id,类似权限添加那块,带model_前缀,后面是模型名,点用下划线代替

state:code,表示执行的动作

code: model.固定写法,后面跟模型要调用的方法

interval_number: 这里表示每1分钟执行一次,如果是30,就表示每30分钟执行一次

interval_type: 执行的周期,minutes, hours, days, weeks, months

numbercall: 表示总共要执行多少次,负数表示无限制,永远执行下去

doall: 为True时,表示服务器重启后,停机期间错过的任务,会被补充执行。

user_id: 调度任务的用户,让odoo自己管理。

升级一下,就可以看到每分钟都会有输出:

执行耗时,只有2秒,说明异步执行了,结果也正确,给力。

还要说一下,在odoo里面可以创建定时任务:(开发者模式)

 

git地址:https://github.com/SamNicole1809/odoo12_my_pro

posted @ 2020-09-17 10:06  御简  阅读(776)  评论(0编辑  收藏  举报