返回顶部
首页 > 资讯 > 后端开发 > Python >django-celery-beat搭建定时任务的实现
  • 652
分享到

django-celery-beat搭建定时任务的实现

django 搭建定时任务django-celery-beat 定时任务 2023-03-21 08:03:24 652人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、创建Django项目和app1、安装定时任务第三方包2、创建djanGo项目并创建一个使用定时任务的app2、新建一个celery.py文件3、创建配置文件config.py

一、创建django项目和app

1、安装定时任务第三方包

pip install django-celery-beat # 插件用来动态配置定时任务,一般会配合 django_celery_results 一起使用,所以一起安装 django_celery_results

pip install django_celery_results
pip install eventlet # windows下运行celery 4以后版本,还需额外安装eventlet库

2、创建django项目并创建一个使用定时任务的app

1.1创建django项目并创建app

创建的过程省略,不在这里展开,需要注意的是setting文件注册app的配置如下:

INSTALLED_APPS = [
    ......
    'myapp',  # 刚创建的使用定时任务的app
    'django_celery_beat',  # 插件用来动态配置定时任务,只要进行了第一步pip安装就可以直接注册了
    'django_celery_results',
]

1.2 创建定时任务数据库
依次执行: python manage.py makemigrations 和 Python manage.py migrate
打开数据库发现,自动创建了一些表如下:

这些都是定时任务需要的表格,自动创建不需要手动管理

django_celery_beat.models.ClockedSchedule # 特定时刻任务
django_celery_beat.models.CrontabSchedule # 特定时间表任务,例如每周1运行的计划
django_celery_beat.models.IntervalSchedule # 以特定间隔(例如,每5秒)运行的计划。
django_celery_beat.models.PeriodicTask # 此模型定义要运行的单个周期性任务。
django_celery_beat.models.PeriodicTasks # 此模型仅用作索引以跟踪计划何时更改
django_celery_beat.models.SolarSchedule # 定制任务

如果安装注册了django_celery_results 还会有另外三个表:

2、新建一个celery.py文件

文件的作用是指定django环境、创建Celery app和指定Celery配置文件的启动位置,类似与wsgi.py或asgi.py,因此也建议文件创建位置与wsgi.py或asgi.py同级。
文件内容如下:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platfORMs

# 设置django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lc_manage.settings.settings')

# 创建一个Celery app
app = Celery('djangotask')
platforms.C_FORCE_ROOT = True   # 如果配置没有生效需要在启动时设置  export C_FORCE_ROOT="true"

#  使用CELERY_ 作为前缀,在celeryconfig.py中写配置
app.config_from_object('lc_manage.celeryconfig', namespace="CELERY")
# app.config_from_object('lc_manage.celeryconfig')

# 发现任务文件每个app下的tasks.py
app.autodiscover_tasks()

3、创建配置文件config.py

这个文件里的内容可以写到项目的 settings.py里面,因为上面的celery.py 中可以指定配置文件位置;不过内容比较多,还是建议单独创建一个配置文件celeryconfig.py,可以与celery.py 同级目录,文件内容如下:

from __future__ import absolute_import

# broker 设置 指定中间代理人将任务存到哪里,这里是Redis的11号库
CELERY_BROKER_URL = 'redis://:123456@127.0.0.1:6379/11'
# 指定 Backend 储存结果的地方,可以使用django数据库(django-db),也可以使用redis,
# 使用django数据库(django-db),以后运行worker就会保存到数据库中,可以通过ORM进行访问
# CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'django-db'

# 使用django_celery_beat插件用来动态配置任务
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

# 指定时区,默认是 UTC
CELERY_TIMEZONE = 'Asia/Shanghai'

# celery 序列化与反序列化配置
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['pickle', 'JSON']
CELERY_TASK_IGNORE_RESULT = True

# 有些情况下可以防止死  非常重要!
CELERYD_FORCE_EXECV = True
# 为存储结果设置过期日期,默认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_DISABLE_RATE_LIMITS = True
# celery beat配置(周期性任务设置)
CELERY_ENABLE_UTC = False

# 官方用来修复CELERY_ENABLE_UTC=False and USE_TZ = False 时时间比较错误的问题;
# 详情见:https://GitHub.com/celery/django-celery-beat/pull/216/files
DJANGO_CELERY_BEAT_TZ_AWARE = False

这里需要注意的是,如果在celery.py中配置指定了confiig配置文件使用CELERY前缀:app.config_from_object(‘lc_manage.celeryconfig’, namespace=“CELERY”),那么celeryconfig.py配置文件的参数都应加:CELERY_,当然你也可以不用第二个参数,namespace=“CELERY"写成app.config_from_object(‘lc_manage.celeryconfig’”), 那么celeryconfig.py中就不需要加CELERY_ 前缀,注意一定要统一!!!否则可能 会报错:

consumer: Cannot connect to aMQp://guest:**@127.0.0.1:5672//: [Errno 61] Connection refused.

4、加载celery.py

我们自己创建的celery.py虽然与wsgi.py 或者 asgi.py等同级,但是 不会像他们一样自动加载,需要我们通过本级文件下的__init__.py 把celery.py 加载进来,打开__init__.py文件,添加如下内容:

 from __future__ import absolute_import, unicode_literals
 from .celery import app as celery_app
# 使得django启动时加载celery的app
__all__ = ('celery_app',)

5、创建定时任务执行内容

经过上面的配置,django-celery_beta 会自动去扫描每个app目录下是否有 tasks.py 文件,需要创建定时任务的app下我们可以手动创建tasks.py,定时任务就写在这个文件上:

from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def add(x, y):
    print("x + y  =  ", x + y)
    return x + y

@shared_task
def mul(x, y):
    print("x * y  =  ", x * y)
    return x * y

二、定时器创建和定时任务添加

1、时间和周期控制:IntervalSchedule、ClockedSchedule和CrontabSchedule

其他帖子都把上面三个称为定时任务与PeriodicTask放一起结束,但是个人理解以上三个都是定时任务时控制时间和周期执行的控制器,并非创建定时任务,真正创建定时任务的只有PeriodicTask,所以这里个人把这三个称为定时任务的“时间和频率控制器”。

  • IntervalSchedule 按时间间隔频率执行定时任务的控制器,(例:每间隔1H/1M/…执行一次)
  • ClockedSchedule 指定某个时刻执行定时任务的控制器, (例:2018年8月8号 8:00这个时刻执行)
  • CrontabSchedule 指定某个时间执行定时任务的控制器 (例:每年的12月星期一的8:30)

导入这四个模块:

from django_celery_beat.models import CrontabSchedule, PeriodicTask, IntervalSchedule,ClockedSchedule 

1.1 IntervalSchedule 时间间隔控制器

参数:every 间隔数,period 间隔单位

schedule, created = IntervalSchedule.objects.update_or_create(
    every=1,
    period=IntervalSchedule.MINUTES)   # 按分钟间隔执行 

第二个参数可选

  • IntervalSchedule.DAYS 固定间隔天数
  • IntervalSchedule.HOURS 固定间隔小时数
  • IntervalSchedule.MINUTES 固定间隔分钟数
  • IntervalSchedule.SECONDS 固定间隔秒数
  • IntervalSchedule.MICROSECONDS 固定间隔微秒

返回值可直接解包,其实只有第一个参数schedule有用,在PeriodicTask创建定时任务时作为时间和周期控制参数传入。解包获得的第二个数据created 可以直接用下划线取代

1.2 ClockedSchedule特定时刻定时器

参数:clocked_time 指定时间

clocked, _ = ClockedSchedule.objects.update_or_create(
    clocked_time =datetime.strptime("2020-08-18 16:58:46","%Y-%m-%d %H:%M:%S"))   # 按指定时间执行 

这里第二个参数直接用下划线取代。特定时刻控制一般时执行一次,适合在view中调用执行一次性计划。

1.3、周期性任务 CrontabSchedule

参数:

  • month_of_year # 几月执行
  • day_of_month # 几号执行
  • day_of_week # 周几执行
  • hour # 几点执行
  • minute # 几分执行
  • timezone # 时区
crontab, _ = CrontabSchedule.objects.update_or_create(
    minute="00",
    hour="23",   
    day_of_week="*",   # 周几执行
    day_of_month='1',  # 几点执行
    month_of_year='*',    
    timezone=pytz.timezone("Asia/Shanghai"),
)

上面的星号代表不使用,上面的配置即: 每月1日的23点执行一次。如果day_of_month=“*”则代表每天23点执行。

2、动态添加任务 PeriodicTask

参数:

  • name:任务名
  • task:指定的任务
  • interval:时间间隔
  • crontab:时间控制器
  • clocked:指定时刻控制器
  • expires:有效日期
  • one_off:启用状态(如果为True,调度将只运行该任务一次)
  • start_time:开始时间
  • enabled:启用
  • last_run_at:最后运行时间
  • total_run_count:运行总次数
  • date_changed:最后的更改时间
  • description:描述
  • args: 传参

注意:

1、interval、crontab、clocked三选一,不可同时使用。参数值分别对应interval:schedule(IntervalSchedule的第一个返回值);crontab:crontab(CrontabSchedule的第一个返回值);clocked:clocked(ClockedSchedule返回值)
2、name :任务名,确保其唯一性!!!!
3、task:后面是以字符串形式调用定时任务的具体工作内容函数,即第一项的第5条用@shared_task装饰器创建的方法。
4、enabled:是否启用,这里动态创建的话一般设为true
5、args: 传参(task中指定的任务需要传参时使用),注意需要json序列化 json.dumps(…)

其他参数均为非必填项。

PeriodicTask.objects.update_or_create(
    name=working_point_record_id + 'working_time_1',
    defaults={
        "task": "apps.tasks.add",
        "crontab": crontab,
        "enabled": True,
        "args": json.dumps([working_point_record_id])
    },

4、封装方法

一般情况下,可以把IntervalSchedule、ClockedSchedule和CrontabSchedule根据业务需求单独封装一个文件,而PeriodicTask.objects直接在对应view视图中调用即可。

三、启动定时任务beat

定时任务是独立与django项目运行的,django只是定时任务的入口和操作数据库的入口,而这前提是django-celery-beat 已经独立启动,django-celery-beat的启动分两步,一是生产者单独启动(beat),而是工作者单独启动(worker),这里启动顺序需要注意一点,建议先启动worker 再启动beat ,曾经遇到先启动beat有可能beat会启动失败。

1、启动工作者worker

此时仍然需要重新打开一个命令窗口,进入django项目的根目录(manage.py同级目录)下:

# linux测试,启动Celery
 Celery -A 【项目名称】worker -l info  
 ​
 # Windows下测试,启动Celery
 Celery -A 【项目名称】worker -l info -P eventlet
 ​
 # 如果Windows下Celery不工作,输入如下命令
 Celery -A 【项目名称】worker -l info --pool=solo

2、启动生产者beat

beat 是一个生产者角色,是单独运行,生产者完全不依赖django,需要与django在一个不同的命令窗口运行,但启动时需要先进入django项目的根目录,即与manage.py在同一目录下:

celery  -A 【项目名称】 beat -l info

四、定时任务创建

这里要划重点了,其实看完上面的已经可以使用了,下面的属于优化选择性理解,看个人理解能力和需求:

一般情况下,定时器创建和定时任务添加 PeriodicTask会在view视图中创建,但是如果view视图比较频繁,那么每次执行view都创建一个定时任务的话会有无数个,会比较占用内存资源,当然可以在celeryconfig.py设置执行多少次后重启任务,高并发下view会不会导致频繁重启,这里需要根据业务逻辑把@shared_task包裹下的任务处理方法做成批量处理放到单独文件中(不需要在view视图中调用,定时调用批处理,那么就是一个任务批量处理数据而已),在间隔固定时间下执行,单纯语言难以表达清楚,理解的就理解了,不理解的就慢慢体会吧。这里需要画重点的是:如果你理解了单个文件写@shared_task批处理方法,那么你的问题重点就是:我如何启动它呢?难道每次在启动beat后在命令行启动吗?虽然也可以,但是如果项目需要创建的定时任务很多怎么办,不用多,几百行可以了,每次在命令行复制粘贴执行命令 吗?当然不要,其实直接创建一个单独的python文件,然后再根目录下的url中导入即可,因为url在项目启动的时候会自动加载一次,也就相当于启动django项目的时候就自动创建了一次定时任务!

到此这篇关于django-celery-beat搭建定时任务的实现的文章就介绍到这了,更多相关django-celery-beat 定时任务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: django-celery-beat搭建定时任务的实现

本文链接: https://lsjlt.com/news/200653.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • django-celery-beat搭建定时任务的实现
    目录一、创建django项目和app1、安装定时任务第三方包2、创建django项目并创建一个使用定时任务的app2、新建一个celery.py文件3、创建配置文件config.py...
    99+
    2023-03-21
    django 搭建定时任务 django-celery-beat 定时任务
  • 怎么用django-celery-beat搭建定时任务
    本篇内容主要讲解“怎么用django-celery-beat搭建定时任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用django-celery-beat搭建定时任务”吧!一、创建djan...
    99+
    2023-07-05
  • 关于Django使用 django-celery-beat动态添加定时任务的方法
    版本信息 # 插件安装 Django==2.2.2 django-celery-beat==2.1.0 django-redis==4.8.0 mysqlclient==2.0...
    99+
    2024-04-02
  • Django+Celery实现定时任务的示例
    目录一、前言二、配置使用定义与触发任务扩展三、Django中使用定时任务二次开发一、前言   Celery是一个基于python开发的分布式任务队列,而做python WEB开发最为...
    99+
    2024-04-02
  • celery实现动态设置定时任务
    本文实例为大家分享了celery动态设置定时任务的具体代码,供大家参考,具体内容如下 首先celery是一种异步任务队列,如果还不熟悉这个开源软件的请先看看官方文档,快速入门。 这里...
    99+
    2024-04-02
  • celery异步定时任务怎么实现订单定时回滚
    这篇文章主要介绍“celery异步定时任务怎么实现订单定时回滚”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“celery异步定时任务怎么实现订单定时回滚”文章能帮助大家解决问题。订单回滚用celer...
    99+
    2023-06-30
  • Django+Nginx+uWSGI定时任务的实现方法
    目录摘要使用uWSGI的cron使用socket.bind锁使用uWSGI的mule摘要 在Nginx和uWSGI还没配置时,单独在url.py使用apscheduler设置定时任务...
    99+
    2024-04-02
  • Django+Nginx+uWSGI定时任务怎么实现
    今天小编给大家分享一下Django+Nginx+uWSGI定时任务怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。摘要...
    99+
    2023-06-28
  • Django定时任务实现方法有哪些
    本篇内容介绍了“Django定时任务实现方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言为了做一些报表,最近需要每日从爱站...
    99+
    2023-06-04
  • Django中如何使用Celery实现异步任务处理
    在Django中使用Celery实现异步任务处理需要按照以下步骤来进行: 安装Celery和Redis: pip install...
    99+
    2024-04-02
  • Django 中的并发请求处理:使用 Celery 实现异步任务。
    Django 中的并发请求处理:使用 Celery 实现异步任务 在现代 Web 应用程序中,处理并发请求是至关重要的。Django 是一个强大的 Web 框架,但是它并不擅长处理大量的并发请求。为了解决这个问题,我们可以使用 Celery...
    99+
    2023-08-08
    并发 apache django
  • Python Celery动态添加定时任务生产实践指南
    目录一、背景二、Celery动态添加定时任务的官方文档三、celery简单实用3.1 基础环境配置3.2 测试使用Celery应用四、配置backend存储任务执行结果 四...
    99+
    2024-04-02
  • Django定时任务Django-crontab的使用详解
    在使用的django做测试平台时,,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔 10分钟执行一次,也可能是定点时间,比如 14:0...
    99+
    2024-04-02
  • Python实现定时任务
    Python下实现定时任务的方式有很多种方式。下面介绍几种 循环sleep: 这是一种最简单的方式,在循环里放入要执行的任务,然后sleep一段时间再执行。缺点是,不容易控制,而且sleep是个阻塞函数。...
    99+
    2022-06-04
    Python
  • Java实现定时任务
    本文实例为大家分享了Java实现定时任务的具体代码,供大家参考,具体内容如下 1 使用java.util.Timer 这种方式的定时任务主要用到两个类,Timer 和 TimerTa...
    99+
    2024-04-02
  • django+celery+RabbitMQ自定义多个消息队列的实现
    关于django celery的使用网上有很多文章,本文就不多做更多的说明。 本文使用版本 python==3.8.15Django==3.2.4celery==5.2.7 cele...
    99+
    2023-02-22
    django celery RabbitMQ消息队列 django celery 消息队列
  • linux创建PHP定时任务的实例
    linux创建PHP定时任务 下面所有的前提是服务器存在PHP环境 首先创建一个php文件:示例内容如下: <?php $ch=curl_init(); //设置请求 curl_setop...
    99+
    2022-06-04
    实例 linux PHP
  • python-crontab实现定时任务
    用django-crontab实现定时任务: 1.安装django-crontab 2.安装完成后,将‘django-crontab’添加到settings.py中的INSTALL_APP中, 然后在CRONJOBS中定义自己的定时任务 ...
    99+
    2023-01-31
    python crontab
  • Python中threading.Timer()定时器实现定时任务
    目录1、单线程执行2、多线程执行timer最基本理解就是定时器,可以启动多个定时任务,这些定时器任务是异步执行,所以不存在等待顺序执行问题。 Timer方法说明Timer(inter...
    99+
    2023-01-28
    threading.Timer()定时器 threading.Timer()定时任务
  • Django celery实现异步任务操作,并在后台运行(守护进程)
    没废话,直接上代码。 环境说明: python3.6 django2.0.5 我们使用redis的作为celery任务队列,有一个合成包可以直接安装两者一起使用需要的安装包 直接在终...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作