Rosmontis&迷迭香的博客&鹤望兰分部

Rosmontis&迷迭香的博客
僅用於Bing訪客使用,若需要最新的文章,建議訪問rosmontis.com
  1. 首页
  2. 正文

Django动态添加定时任务之django-celery的使用

2022年5月7日 19点热度 0人点赞 0条评论

定时任务和周期任务在我们日常工作中应用广泛,例如定时发布、周期巡检等,通常我们会借助Linux下的Crontab来实现,但如何将这一功能搬进我们自研的运维系统呢?借助django-celery即可轻松完成,本篇文章就通过自定义任务引擎Probius中计划任务的实现来介绍django-celery的使用

Celery是基于Python开发的一个分布式任务队列框架,主要用来实现异步任务,Django本身不支持异步,要想实现异步的话借助Celery是个不错的选择,但其配置稍微复杂,且不支持动态添加定时任务,django-celery的出现很好的解决了这个问题

django-celery为django提供了celery集成,同时支持将结果存储在django的orm或cache中,最重要的是支持从数据库动态读取计划任务并执行,这也就是说我们只需要将需要执行的加护任务插入数据库,django-celery就可以自动发现并执行了,接下来就具体看下如何实现

安装配置

1.  安装django-celery

pip install django-celery

2.  settings.py的INSTALLED_APPS中加入djcelery

INSTALLED_APPS = [
    ...
    'djcelery',
]

3.  settings.py中添加如下配置

import djcelery
djcelery.setup_loader()

# BROKER和BACKEND配置,这里用了本地的redis,其中1和2表示分别用redis的第一个和第二个db
BROKER_URL = 'redis://localhost/1'
CELERY_RESULT_BACKEND = 'redis://localhost/2'

# celery 关闭UTC时区
CELERY_ENABLE_UTC = False

# celery 并发数设置,最多可以有20个任务同时运行
CELERYD_CONCURRENCY = 20
CELERYD_MAX_TASKS_PER_CHILD = 4

# celery开启数据库调度器,数据库修改后即时生效
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

from celery import platforms

# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True

4.  启动celery

python manage.py celery worker -l info

至此就可以使用djcelery来处理异步任务了

异步调用

具体的用法为在app根目录下添加一个tasks.py文件,在文件中编写函数,给函数添加上shared_task装饰器即可

假设一个项目有如下目录结构

project
    - coffee
        - __init__.py
        - admin.py
        - app.py
        - models.py
        - tasks.py
        - tests.py
        - views.py
    - webapp
        - __init__.py
        - settings.py
        - urls.py
        - wsgi.py
    - manage.py

我们在名为coffee的app下添加文件tasks.py,tasks.py文件内容如下

from celery import shared_task


@shared_task
def welcome():
    print('Welcome to ops-coffee.cn')

    return True

然后就可以在view或其他地方异步调用这个welcome函数了

from django.http import JsonResponse
from coffee.tasks import welcome


def index(request):
    welcome.delay()

    return JsonResponse({"state": 1, "message": "welcome"})

周期任务

以上只是将任务变成了异步,如果我们想要周期执行welcome任务,该如何操作呢?

1.  首先需要执行migrate命令在数据库创建表

python manage.py migrate

2.  然后修改settings.py文件中添加CELERYBEAT_SCHEDULE配置

CELERYBEAT_SCHEDULE = {
    'ops-coffee-1': {
        'task': 'coffee.tasks.welcome',
        'schedule': timedelta(seconds=20)
    },
    'ops-coffee-2': {
        'task': 'coffee.tasks.welcome',
        'schedule': crontab(hour=17, minute=30),
    }
}

以上配置详细的解释可以看文章:Django配置Celery执行异步任务和定时任务

3.  最后启动beat

python manage.py celery beat -l info

至此welcome任务就会在设置的时间执行了

报错处理

PS: 启动beat时可能会有如下报错

TypeError: can't subtract offset-naive and offset-aware datetimes

这主要是因为时区引起的,请修改时区相关的配置

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

动态添加

至此已经可以添加周期任务或定时任务了,但操作方式比较麻烦,还需要改动配置文件,说好的动态添加呢,别急这就来了,打开数据库会看到几张以djcelery_开头的表

其中对于动态添加计划任务有用的是计划任务时间定义表djcelery_crontabschedule,循环任务时间定义表djcelery_crontabschedule,以及任务表djcelery_periodictask

只需要在对应的表里插入数据就ok了,以我在自定义任务引擎Probius中的使用为例,前端会传递时间到view,view中关于定时任务的的大概处理逻辑如下

from djcelery.models import CrontabSchedule, PeriodicTask

with transaction.atomic():
    save_id = transaction.savepoint()

    try:
        _c, created = CrontabSchedule.objects.get_or_create(
            minute=str(minute),
            hour=str(hour),
            day_of_week=str(day_of_week),
            day_of_month=str(day_of_month),
            month_of_year=str(month_of_year)
        )

        dt = datetime.now().strftime('%Y%m%d%H%M%S')
        _p = PeriodicTask.objects.create(
            name=dt + '-' + '运维咖啡吧周期任务A',
            task='coffee.tasks.welcome',
            args=[37],
            enabled=True,
            crontab=_c
        )

        print('计划任务添加成功')
    except Exception as e:
        transaction.savepoint_rollback(save_id)
        print('添加计划任务失败,错误原因:' + str(e))

通过with transaction.atomic()创建一个事物,保证时间和任务都能同时添加成功,否则就回滚

然后通过get_or_create方法去检索循环任务时间定义表CrontabSchedule,如果有就获取到实例,没有就创建

最后往任务表PeriodicTask里插入任务,name为任务名称,具有唯一性,所以这里加了时间前缀防止重复,task为celery的task任务,字符串类型,在启动celery的时候就可以看到,args传给任务的参数,这里也可以用kwargs的字典形式传,就把args字段改成kwargs即可,enabled定义了这个任务是启动或关闭状态,crontab为循环任务时间实例,如果这里要用周期任务,就是每n秒n分循环执行这样的,只需要将crontab关联换成interval即可,那就需要事先往IntervalSchedule表里插入数据

还记得开头settings.py配置文件中我们配置的CELERYBEAT_SCHEDULER吗?就因为有这个配置,所以当数据表里的数据变更之后,celery的beat程序就能监听到从而在配置的时间触发worker去执行任务

至此,主要功能我们都已实现,django-celery的计划任务只能支持固定时间吗?其实不然,他支持的语法与linux下的crontab类似,像hour='*/3,9-18'这样的复杂语法也是支持的,在Probius中对于复杂语法我们也直接提供了更为灵活的自定义任务执行方式

为了便于使用,减少学习成本,这里就直接用了linux下crontab的格式,传到后端后解析成对应的时间写入数据库。

标签: 暂无
最后更新:2022年6月8日

Rosmontis

这个人很懒,什么都没留下

点赞

文章评论

取消回复

Rosmontis

这个人很懒,什么都没留下

本站文章约1个月与rosmontis.com同步一次

链接可将rosmontis.net改为com查看更多内容

最新 热点 随机
最新 热点 随机
【拉环社】【Onedrive】仰望夜空的星辰Fine Days/抬头看看吧,看那天上的繁星Fine Days(FD)完整汉化+全CG(4.9GB) 【拉环社】【Onedrive】仰望夜空的星辰IF/抬头看看吧,看那天上的繁星IF -Interstellar Focus-(FD)完整汉化+全CG(2.8GB) 【漩涡社】鲸神的提亚斯提拉/鲸神的Tearstilla 鯨神のティアスティラ 完整汉化+全CG(3.2GB) 【拉环社】【Onedrive】仰望夜空的星辰/抬头看看吧,看那天上的繁星(本作) 见上げてごらん、夜空の星を 完整汉化+全CG(6.5GB) 【SAGA PLANETS】【Onedrive】FD:金色loveriche-金色时光- 金色ラブリッチェ -Golden Time- 完整汉化+全CG(5.5GB) 【SAGA PLANETS】【Onedrive】金辉恋曲四重奏/金色Loveriche 金色ラブリッチェ 完整汉化+全CG(5.6GB) 【Onedrive】娇蛮任性HIGHSPEC ワガママハイスペック 完整汉化(7.2GB) 【Alcot】【Onedrive】FD:将军大人芳华正茂 Fandisc 将軍様はお年頃 ふぁんでぃすく -御三家だヨ!全員集合- 完整汉化+全CG(3.0GB) 【Alcot】【Onedrive】将军大人芳华正茂/将军大人风华正茂 将军様はお年顷 完整汉化+全CG(4.20GB) 国产动画《京剧猫》,被运营耽搁的好动画,哀其不幸怒其不争! 【Onedrive】架向星空之桥AA 架向星空之桥FAN DISC 星空へ架かる桥AA 完整汉化(3.6GB) 【Onedrive】架向星空之桥 星空へ架かる桥 完整汉化(4.3GB) 【颜艺社】【Onedrive】寄宿之恋 かりぐらし恋爱 完整汉化+全CG(2.7GB) 【八月社】【Onedrive】秽翼的尤斯蒂娅 秽翼のユースティア 完整汉化(4.7GB) 【橘子社妈妈累】【Onedrive】回家之前的棉花糖 お家に帰るまでがましまろです 完整汉化+全CG(5.8GB) 【SAGA PLANETS】【Onedrive】花之天使的夏日恋歌 フローラル・フローラブ 完整汉化+全CG(3.7GB) 【音符社】【Onedrive】花与乙女的祝福+花与乙女的祝福 皇家花束 完整汉化(共3.9GB) 【2022.06更新】【Onedrive】最全!花吻在上/亲吻那片花瓣 その花びらにくちづけを 1~20本作+3番外共23作 完整汉化(约10.5GB) 【Onedrive】花色温泉乡/花色七芒星 花色ヘプタグラム 完整汉化(3.6GB) 【CRYSTALIA】红月摇曳的恋之星火SS 与旭同往~来自盛夏的某日~ 旭とワンルーム ~とある夏の一日~ 完整汉化+全CG (550MB) 【CRYSTALIA】红月摇曳的恋之星火SS 与红叶同住 ~来自盛夏的某日~ 紅葉とワンルーム ~とある夏の一日~ 完整汉化+全CG (580MB) 【CRYSTALIA】红月摇曳的恋之星火 紅月ゆれる恋あかり 完整汉化+全CG (2.5GB) 【Onedrive】FD:景之海的艾佩莉亚 ~卡萨布兰卡的骑士~ 景の海のアペイリア ~カサブランカの騎士~ 完整汉化+全CG(2.3GB) 【Onedrive】景之海的艾佩莉娅/海景的艾佩利雅 景の海のアペイリア 完整汉化+全CG(3.0GB) 【柚子社】【Onedrive】管乐恋曲!~The bonds of melody~ ぶらばん! ~The bonds of melody~ 完整汉化(3.0GB) 【Onedrive】【妹抱FD】哥哥,早上起床之前都要抱紧我哦!晚上睡觉之前学更多Java吧!完整汉化+全CG(4.4GB) 【Onedrive】哥哥,早上起床之前都要抱紧我哦!(妹抱)お兄ちゃん、朝までずっとギュってして!完整汉化+全CG(7.0GB) 【SLG】夏日狂想曲:乡间的难忘回忆 【拉环社】【Onedrive】在这苍穹展翅/在这苍穹之中展开双翼 この大空に、翼をひろげてIf My Heart Had Wings 完整汉化(4.3GB) 【拉环社】【Onedrive】在这苍穹展翅-飞行日志- If My Heart Had Wings -Flight Diary- この大空に、翼をひろげて FLIGHT DIARY 完整汉化(3.0GB)
【SLG】夏日狂想曲:乡间的难忘回忆【海豹社】【Onedrive】爱之钥系列 爱之钥田园夏日 アイカギ~アフターデイズ~ 完整汉化+全CG(1.4GB)【SAGA PLANETS】【Onedrive】FD:金色loveriche-金色时光- 金色ラブリッチェ -Golden Time- 完整汉化+全CG(5.5GB)【Onedrive】娇蛮任性HIGHSPEC ワガママハイスペック 完整汉化(7.2GB)【Onedrive】骑士系列 恋骑士Purely☆Kiss 完整汉化+全CG(3.6GB)【CRYSTALIA】红月摇曳的恋之星火 紅月ゆれる恋あかり 完整汉化+全CG (2.5GB)【SAGA PLANETS】【Onedrive】金辉恋曲四重奏/金色Loveriche 金色ラブリッチェ 完整汉化+全CG(5.6GB)【拉环社】【Onedrive】仰望夜空的星辰Fine Days/抬头看看吧,看那天上的繁星Fine Days(FD)完整汉化+全CG(4.9GB)【Onedrive】FD:景之海的艾佩莉亚 ~卡萨布兰卡的骑士~ 景の海のアペイリア ~カサブランカの騎士~ 完整汉化+全CG(2.3GB)【Onedrive】景之海的艾佩莉娅/海景的艾佩利雅 景の海のアペイリア 完整汉化+全CG(3.0GB)【Onedrive】哥哥,早上起床之前都要抱紧我哦!(妹抱)お兄ちゃん、朝までずっとギュってして!完整汉化+全CG(7.0GB)【CRYSTALIA】红月摇曳的恋之星火SS 与红叶同住 ~来自盛夏的某日~ 紅葉とワンルーム ~とある夏の一日~ 完整汉化+全CG (580MB)【CRYSTALIA】红月摇曳的恋之星火SS 与旭同往~来自盛夏的某日~ 旭とワンルーム ~とある夏の一日~ 完整汉化+全CG (550MB)【Onedrive】花色温泉乡/花色七芒星 花色ヘプタグラム 完整汉化(3.6GB)【2022.06更新】【Onedrive】最全!花吻在上/亲吻那片花瓣 その花びらにくちづけを 1~20本作+3番外共23作 完整汉化(约10.5GB)【音符社】【Onedrive】花与乙女的祝福+花与乙女的祝福 皇家花束 完整汉化(共3.9GB)【SAGA PLANETS】【Onedrive】花之天使的夏日恋歌 フローラル・フローラブ 完整汉化+全CG(3.7GB)【橘子社妈妈累】【Onedrive】回家之前的棉花糖 お家に帰るまでがましまろです 完整汉化+全CG(5.8GB)【八月社】【Onedrive】秽翼的尤斯蒂娅 秽翼のユースティア 完整汉化(4.7GB)【颜艺社】【Onedrive】寄宿之恋 かりぐらし恋爱 完整汉化+全CG(2.7GB)【Onedrive】架向星空之桥 星空へ架かる桥 完整汉化(4.3GB)【Onedrive】架向星空之桥AA 架向星空之桥FAN DISC 星空へ架かる桥AA 完整汉化(3.6GB)国产动画《京剧猫》,被运营耽搁的好动画,哀其不幸怒其不争!【Alcot】【Onedrive】将军大人芳华正茂/将军大人风华正茂 将军様はお年顷 完整汉化+全CG(4.20GB)【Alcot】【Onedrive】FD:将军大人芳华正茂 Fandisc 将軍様はお年頃 ふぁんでぃすく -御三家だヨ!全員集合- 完整汉化+全CG(3.0GB)【拉环社】【Onedrive】仰望夜空的星辰/抬头看看吧,看那天上的繁星(本作) 见上げてごらん、夜空の星を 完整汉化+全CG(6.5GB)【漩涡社】鲸神的提亚斯提拉/鲸神的Tearstilla 鯨神のティアスティラ 完整汉化+全CG(3.2GB)【拉环社】【Onedrive】仰望夜空的星辰IF/抬头看看吧,看那天上的繁星IF -Interstellar Focus-(FD)完整汉化+全CG(2.8GB)【雪碧社Sprite】【Onedrive】苍之彼方的四重奏EXTRA2 DL Edition 蒼の彼方のフォーリズム EXTRA2 生肉+全CG(3.5GB)【Onedrive】爱因斯坦携爱敬上APOLLOCRISIS アインシュタインより愛を込めて APOLLOCRISIS 汉化本体+全CG(2.3GB)
Zabbix Web页面报错:Received empty response from Zabbix Agent at [xxx.xxx.xxx.xxx]. Assuming that agent dropped connection because of access permission. Zabbix被监控端日志报错:active check configuration update from [127.0.0.1:10051] started to fail (cannot connect to [[127.0.0.1]:10051]: [111] Connection refused) 【明日方舟解包】【spine】浊心斯卡蒂 贴图立绘+动态骨架文件 【YUZUSOFT】【Onedrive】DRACU-RIOT!【3.4G】 详解XHTML中的标题标签与段落标签的使用 Zabbix被监控端日志报错:Failed to accept an incoming connection: connection from "xxx.xxx.xxx.xxx" rejected, allowed hosts: "127.0.0.1" Zabbix被监控端日志报错:no active checks on server [XXXXX]: host [XXXXX] not found Django—用户注册登录功能实现 如何使用Nginx为 Django 服务配置负载均衡 Zabbix Web页面报错:Assuming that agent dropped connection because of access permissions. 嘿嘿嘿~~~ 栞那 【CRYSTALiA】【Onedrive/百度云】牵绊闪耀的恋之伊吕波-绊きらめく恋いろは(4.0G) 2022年GAL中毒玩家观看亲爱的弗兰克斯《DARLING in the FRANXX》有感 VB实现强制关闭360安全卫士 Wordpress迁站后,发布文章后及修改固定链接后打开文章出现404的问题 如何在CentOS系统中部署Django项目 【Onedrive】9-nine系列之 9-nine-雪色雪花雪余痕(3.5 GB) 【音符社】【Onedrive】有少女献鸣的爱之奏章 ~愿奏章之上思念满载~ (有少女献鸣的爱之奏章FD)(2.20 GB) 【音符社】【Onedrive】樱舞少女的轮舞曲~女装主人公们的受难记~(180MB) 【Onedrive】向日葵教会和漫长的暑假 向日葵の教会と長い夏休み  (2.2 GB) 使用Dragon Bones(龙骨)合成,编辑,导出游戏内解包的人物动态文件 【实用!】WPS政府版下载!所有功能全解锁!!! 【Campus】【Onedrive/百度云】初恋症候群(1.5G) 哪吒服务器监控:监控服务器CPU,网络状态,内存等信息。支持监控报警,在线终端 【明日方舟】【YOUTUBE转载】轮到温蒂给你洗脑了 【海豹社】【Onedrive】爱之钥系列 爱之钥田园夏日 アイカギ~アフターデイズ~ 完整汉化+全CG(1.4GB) 【Onedrive】骑士系列 龙骑士Bloody†Saga/竜騎士Bloody†Saga 完整汉化+全CG(3.3GB) 【百度云】甜蜜恶魔!Honey&Devil完整全线汉化硬盘版+全CG存档(4.2G) Django动态添加定时任务之django-celery的使用

COPYRIGHT © 2022 Rosmontis&迷迭香的博客&鹤望兰分部. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang