iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用django-celery-beat搭建定时任务
  • 123
分享到

怎么用django-celery-beat搭建定时任务

2023-07-05 14:07:58 123人浏览 泡泡鱼
摘要

本篇内容主要讲解“怎么用Django-celery-beat搭建定时任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用djanGo-celery-beat搭建定时任务”吧!一、创建djan

本篇内容主要讲解“怎么用Django-celery-beat搭建定时任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用djanGo-celery-beat搭建定时任务”吧!

    一、创建django项目和app

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

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

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

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

    1创建django项目并创建app

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

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

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

    怎么用django-celery-beat搭建定时任务

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

    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 还会有另外三个表:

    怎么用django-celery-beat搭建定时任务

    2、新建一个celery.py文件

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

    from __future__ import absolute_import, unicode_literalsimport osfrom celery import Celery, platfORMs# 设置django环境os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lc_manage.settings.settings')# 创建一个Celery appapp = 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.pyapp.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'# 指定时区,默认是 UTCCELERY_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/filesDJANGO_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_literalsfrom celery import shared_task@shared_taskdef add(x, y):    print("x + y  =  ", x + y)    return x + y@shared_taskdef 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 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 可以直接用下划线取代

    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中调用执行一次性计划。

    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: 传参

    注意:

    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搭建定时任务”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: 怎么用django-celery-beat搭建定时任务

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 怎么用django-celery-beat搭建定时任务
      本篇内容主要讲解“怎么用django-celery-beat搭建定时任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用django-celery-beat搭建定时任务”吧!一、创建djan...
      99+
      2023-07-05
    • django-celery-beat搭建定时任务的实现
      目录一、创建django项目和app1、安装定时任务第三方包2、创建django项目并创建一个使用定时任务的app2、新建一个celery.py文件3、创建配置文件config.py...
      99+
      2023-03-21
      django 搭建定时任务 django-celery-beat 定时任务
    • 关于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
    • 怎么用Python Celery动态添加定时任务
      一、背景实际工作中会有一些耗时的异步任务需要使用定时调度,比如发送邮件,拉取数据,执行定时脚本通过celery 实现调度主要思想是 通过引入中间人redis,启动 worker 进行任务执行 ,celery-beat进行定时任务数据存储二、...
      99+
      2023-05-14
      Python Celery
    • 使用celery怎么动态设置定时任务
      使用celery怎么动态设置定时任务?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。celery的beat运行过程。上图是beat的主要组成结构,beat中包含了...
      99+
      2023-06-08
    • celery异步定时任务怎么实现订单定时回滚
      这篇文章主要介绍“celery异步定时任务怎么实现订单定时回滚”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“celery异步定时任务怎么实现订单定时回滚”文章能帮助大家解决问题。订单回滚用celer...
      99+
      2023-06-30
    • Django定时任务Django crontab如何使用
      这篇文章主要介绍“Django定时任务Django-crontab如何使用”,在日常操作中,相信很多人在Django定时任务Django-crontab如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”D...
      99+
      2023-07-02
    • 如何使用Python Celery动态添加定时任务
      本篇内容介绍了“如何使用Python Celery动态添加定时任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、背景实际工作中...
      99+
      2023-07-06
    • django怎么动态添加定时任务
      在Django中,可以使用celery来实现动态添加定时任务。首先,需要安装Celery:```shellpip install c...
      99+
      2023-09-26
      django
    • django定时触发任务怎么配置
      在Django中,可以使用第三方库django-crontab来配置定时触发任务。下面是配置步骤: 安装django-cronta...
      99+
      2024-03-04
      django
    • Django+Nginx+uWSGI定时任务怎么实现
      今天小编给大家分享一下Django+Nginx+uWSGI定时任务怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。摘要...
      99+
      2023-06-28
    • Django定时任务Django-crontab的使用详解
      在使用的django做测试平台时,,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔 10分钟执行一次,也可能是定点时间,比如 14:0...
      99+
      2024-04-02
    • oracle怎么创建定时任务
      在 oracle 中创建定时任务可以使用 dbms_job 包,步骤如下:1. 创建一个 job(任务);2. 启用 job;3. 禁用 job;4. 删除 job;5. 查看 job ...
      99+
      2024-04-18
      oracle
    • linux怎么新建定时任务
      在Linux系统中,可以使用`crontab`命令来新建定时任务。具体操作如下:1. 打开终端,输入以下命令进入`crontab`编...
      99+
      2023-09-08
      linux
    • django定时任务重复执行怎么解决
      在Django中,可以使用Celery库来实现定时任务的重复执行。Celery是一个分布式任务队列,可以让你在后台异步执行任务,包括...
      99+
      2024-03-07
      django
    • plsql怎么创建jobs定时任务
      在PL/SQL中,可以使用DBMS_SCHEDULER包来创建定时任务(job)。 以下是一个简单的示例来创建一个定时任务: BEG...
      99+
      2024-04-23
      plsql
    • mysql 中怎么利用Navicat 创建定时任务
      本篇文章给大家分享的是有关mysql 中怎么利用Navicat 创建定时任务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  CURDATE(...
      99+
      2024-04-02
    • linux中怎么使用crontab创建定时任务
      这篇文章将为大家详细讲解有关linux中怎么使用crontab创建定时任务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux下可以利用crontab创建定时任务。常用搭配crontab -e 编辑任...
      99+
      2023-06-09
    • 怎么使用Celery Once来防止Celery重复执行同一个任务
      这篇文章给大家分享的是有关怎么使用Celery Once来防止Celery重复执行同一个任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行...
      99+
      2023-06-25
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作