前言

django-celery-beat 可以支持定时任务,把定时任务写到数据库。

接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7环境准备

django-celery-beat 一般结合 django-celery-results一起使用

环境准备

运行系统:linux(centos/debian/ubuntu),不支持windows

Python版本:3.8.5

Django : 2.2.2

celery: 5.2.7

django-celery-results2.4.0

django-celery-beat2.3.0

使用pip安装celery5.2.7版本

pip install celery==5.2.7

安装django-celery-results库:

pip install django-celery-results==2.4.0

安装django-celery-beat

pip install django-celery-beat==2.3.0

定时任务配置

Django 项目中settings.py:

INSTALLED_APPS = (
...,
'django_celery_results',
'django_celery_beat',
)

将django_celery_beat模块和django-celery-results相关配置,写到setting.py

# #  RabbitMQ配置BROKER_URL 和backend
CELERY_BROKER_URL = 'amqp://admin:123456@127.0.0.1:5672//'
# # RESULT_BACKEND 结果保存数据库
CELERY_RESULT_BACKEND = 'django-db' # # SCHEDULER 定时任务保存数据库
# 将任务调度器设为DatabaseScheduler
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
# 为任务设置超时时间,单位秒。超时即中止,执行下个任务。
# CELERY_TASK_TIME_LIMIT = 5
# 为存储结果设置过期日期,默认1天过期。如果beat开启,Celery每天会自动清除。
# 设为0,存储结果永不过期
# CELERY_RESULT_EXPIRES = xx
CELERY_TASK_RESULT_EXPIRES = 60*60*24 # 后端存储的任务超过一天时,自动删除数据库中的任务数据,单位秒
CELERY_MAX_TASKS_PER_CHILD = 1000 # 每个worker执行1000次任务后,自动重启worker,防止任务占用太多内存导致内存泄漏 CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TIMEZONE = 'Asia/Shanghai'
DJANGO_CELERY_BEAT_TZ_AWARE = False

应用Django数据库迁移,创建相关的表

python manage.py migrate django_celery_results
python manage.py migrate django_celery_beat

django_celery_results生成3张表

django_celery_beat生成6张表

相关表的说明

django_celery_beat.models.ClockedSchedule # 此模型存放已经关闭的任务

django_celery_beat.models.CrontabSchedule # 与像在cron项领域的时间表 分钟小时日的一周 DAY_OF_MONTH month_of_year

django_celery_beat.models.IntervalSchedule # 以特定间隔(例如,每5秒)运行的计划。

django_celery_beat.models.PeriodicTask # 此模型定义要运行的单个周期性任务。

django_celery_beat.models.PeriodicTasks # 此模型仅用作索引以跟踪计划何时更改

django_celery_beat.models.SolarSchedule # 定制任务

实例参考

在views视图中,主要用到CrontabSchedule 和PeriodicTask

from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json class CreateTaskView(APIView):
"""创建任务视图""" def post(self, request):
"""创建任务 接口传参,示例
{
"task_name": "任务名称",
"arg1": "参数1",
"arg2": "参数2",
"task_cron": "*/2 * * * *"
}
"""
task_name = request.data.get("task_name")
task_kwargs = {
"task_name": task_name,
"arg1": request.data.get("arg1"),
"arg2": request.data.get("arg2"),
}
# 定时任务规则
cron_value = request.data.get("task_cron")
cro_list = str(cron_value).split(' ')
if len(cro_list) != 5:
return Response({"code": 3003, "msg": "task_cron 不合法"})
cron_time = {
'minute': cro_list[0], # 每2分钟执行一次
'hour': cro_list[1],
'day_of_week': cro_list[2],
'day_of_month': cro_list[3],
'month_of_year': cro_list[4]
}
# 写入 schedule表
schedule = CrontabSchedule.objects.create(**cron_time)
# 任务和 schedule 关联
task_obj = PeriodicTask.objects.filter(name=task_name)
if task_obj:
return JsonResponse({"code": 3000, "msg": "task name exist"}) task_obj, created = PeriodicTask.objects.get_or_create(
name=task_name, # 名称保持唯一
task="app.tasks.task_demo", # 任务的注册路径
crontab=schedule,
enabled=True, # 是否开启任务
# args=json.dumps(task_args),
kwargs=json.dumps(task_kwargs),
# 任务过期时间,设置当前时间往后1天
expires=datetime.datetime.now() + datetime.timedelta(days=1)
)
if created:
return JsonResponse({"code": 0, "msg": "success"})
else:
return JsonResponse({"code": 111, "msg": "create failed"})

其中 task="app.tasks.task_demo" 是任务的注册路径,比如django下有自己的app,在app下创建了一个tasks.py文件

# Create your tasks here
from celery import shared_task @shared_task
def add(x, y):
return x + y

启动worker与beat

最后启动worker与beat

celery -A proj worker -l info
celery -A proj beat -l info

linux 后台启动使用 supervisord 后台启动celery 服务(worker/beat)

相关教程参考这篇https://www.cnblogs.com/yoyoketang/p/16458925.html

python测试开发django-197.django-celery-beat 定时任务的更多相关文章

  1. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  2. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  3. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  4. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  5. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  6. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  7. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

  8. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  9. 【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

随机推荐

  1. python学习-Day37

    目录 今日内容详细 GIL全局解释器锁 GIL与普通互斥锁区别 GIL对程序的影响 验证多线程作用 两个大前提 关于CPU的个数 关于任务的类型 死锁现象 避免死锁的解决: 添加超时释放锁 信号量 自 ...

  2. 通过命令验证docker容器相当一个轻量级的Linux运行环境,且每个容器内都有一个属于自己的文件系统,容器之间相互隔离

    一.docker的三个重要概念 1.镜像:打包项目带上环境,即镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的配置参数.镜像 ...

  3. 简单的TRPG骰子

    又到了新一年的带团季了,今年准备用电脑来存放各种资料,自然也是需要一个简单的骰子工具了,反正也不复杂,就自己写了个,放着做个备份吧 主要功能是计算x1dy1+/-x2dy2+/-.....+/-con ...

  4. Go Context 原理详解

    实现一个小目标 很开心的一件事,学习了一个月的后端拿到一个13k的offer,今年年底目标拿到一个30k的go方向offer. 好了回归正文,这篇文章是回答交流时一个老哥的问题,跟go的context ...

  5. 初探webpack之编写loader

    初探webpack之编写loader loader加载器是webpack的核心之一,其用于将不同类型的文件转换为webpack可识别的模块,即用于把模块原内容按照需求转换成新内容,用以加载非js模块, ...

  6. scrapy框架第二天

    1.scrapy数据分析 2.scrapy持久化存储 3.全站数据爬取 4.请求传参  +   五大核心组件 - 创建scrapy工程 scrapy startproject ProName - 切换 ...

  7. Event Loop 是什么?

    Event Loop 是什么? 本文写于 2020 年 12 月 6 日 广义上来说 Event Loop 并不是 JavaScript 独有的概念,他是一个计算机的通用概念. 狭义上来说,只有 No ...

  8. VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程

    前言: 这是<VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程>一文的姐妹篇教程,如果你需要阅读它,请点击这里. 2020 年,CentOS 宣布:计划未来将重心从 ...

  9. 详细剖析pyecharts大屏的Page函数配置文件:chart_config.json

    目录 一.问题背景 二.揭开json文件神秘面纱 三.巧用json文件 四.关于Table图表 五.同步讲解视频 5.1 讲解json的视频 5.2 讲解全流程大屏的视频 5.3 讲解全流程大屏的文章 ...

  10. typora的下载和基本的使用

    目录 typora的下载和基本的使用 typora的下载 typora基本的使用 选择自己喜爱的主题 创建标题 进入编程环境 改变文本样式 插入链接 插入图片 有序列表 无序列表 创建表格 单选框 表 ...