本文首发于公众号:Hunter后端

原文链接:celery笔记七之周期/定时任务及crontab定义

periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或者每隔半小时运行一遍该函数,都是这种任务的范畴。

在第一篇笔记的时候我们就介绍过 celery 的组件构成,其中有一个组件叫做 beat,就是我们定时任务的调度器。

所有的定时任务都由 beat 发出,这种情况下,你必须确保在同一个时间点只有一个 beat 任务调度器在运行,假设有两个 beat 同时在运行,那么在检测定时任务的时候,系统的任务就可能会被重复发起、调用、执行。

  1. beat_schedule 定义
  2. beat 启动
  3. crontab介绍

1、beat_schedule 定义

我们来定义两个定时任务,一个是 blog.tasks.add,定义为每隔 30s 执行一次,现在晚上11点45分,我们定义每天11点50分执行一次。

在进行这些操作前,我们还需要对时区有一些设置,因为我们设置的晚上11点是北京时间,而 Django 和 celery 默认是格林威治时间。

时区设置

我们使用 Django 系统,一些配置在 settigns.py 中定义,详情可以见前几篇笔记的 celery 与 Django 系统使用。

关于时区,Django 系统和 celery 的时区我们都设置成北京时间:

# settings.py

# django 时区设置
TIME_ZONE = "Asia/Shanghai"
USE_TZ = False # celery 时区设置
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False

定时任务定义

接下来,我们定义定时任务:

from celery.schedules import crontab

app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'blog.tasks.add',
'schedule': 30,
'args': (16, 16),
},
'schedule_test_add': {
'task': 'blog.tasks.minus',
'schedule': crontab(minute="50", hour="23"),
},
}

定时任务的定义是我们通过 app.conf.beat_schedule 来操作,一个任务我们定义一个 name 作为 key

在每个 task 下,分别有以下选项:

task:指向我们定义的任务,比如我们这个是指向 blog application 下 tasks.add 任务

schedule:定时任务的策略,如果直接定义一个整数,比如定义的 add-every-30-seconds task 的这个参数定义为 30,就会每隔30s 执行一次

而如果使用 crontab() 函数,则可以更自由的定义到每个月,每周,每天,每时每秒,在示例中我们定义 minute="50", hour="23" 表示每天 23点50分执行一次

更详细的策略我们下面再详细介绍。

args:定时任务的参数,比如 add() 函数,我们每隔 30s 执行一次,给定的两个参数是 (16, 16),对应 add(x, y) 输入的两个值

2、beat 启动

beat 的启动方式和 worker 启动方式一致,将 worker 改成 beat 即可:

celery -A hunter beat -l INFO

也可以指定日志的输出文件:

celery -A hunter beat -l INFO --logfile=/Users/hunter/python/celery_log/beat.log

当我们启动 beat 的时候,会发现启动的文件夹下会有一个名为 celerybeat-schedule.db 的文件,这个是 beat 保存在本地的上一次任务运行的时间的数据,我们也可以指定该文件的输出地址:

celery -A hunter beat -l INFO -s /Users/hunter/python/celery_log/celerybeat-schedule

如果我们需要运行定时任务,我们需要额外启动两个服务,一个是 beat,一个是 worker

一般来说我们会先启动 worker,再启动 beat,这样 beat 有一些立即发出的任务就可以直接被 worker 接收然后运行。

3、crontab介绍

我们使用 crontab() 函数制定定时任务的时间策略,比如每天运行一次,或者指定周几运行都可以实现。

如果你之前接触过 Linux 服务器上的 crontab 服务,那么就不用担心理解它的使用方式,如果没有,我们可以看看下面官方文档对着的介绍。

在 celery 里,crontab 函数通过 from celery.schedules import crontab 引入,在 beat_schedule 的定义里作为 schedule 的值,这个前面给过一个示例。

crontab 接受五个参数:

  • minute 表示分钟,接收整数或者整数列表,范围在0-59,或者字符串表示配置的时间模式
  • hour 表示小时,接收整数或者整数列表,范围在0-23,或者接收字符串表示配置的时间模式
  • day_of_week 表示周几,接收整数或者整数列表,范围在0-6,其中周日是0,周六是6,或者接收字符串表示配置的时间模式
  • day_of_month 表示一个月的第几天,接收整数或者整数列表,范围在1-31,或者接收字符串表示配置的时间模式
  • month_of_year 表示一年的第几个月,接收整数或者整数列表,范围在1-12,或者接收字符串表示配置的时间模式

minute 和 hour

minute 和 hour 直接指向一天的某个时间点,所以,这两个参数相当于是必填,除非是某些特殊的情况,比如默认的每分钟执行一次:

crontab()

上面的命令,什么参数也不传,表示的是每隔一分钟执行一次

如果我们想指定特定的时间点,比如每天晚上11点23分执行一次:

crontab(minute=23, hour=23)

如果我们想指定某一些分钟,比如分别在 23点11分,23点25分,23点44分钟分别执行一次,可以如下操作:

crontab(minute="11,25,44", hour=23)

如果是上面这种没有特殊关系的时间点,我们可以这样通过逗号分隔连接起来,如果是有特殊关系的,比如说,每隔一分钟,或者每隔三分钟,我们可以通过 */n 的方式来连接。

23点之内,每隔三分钟执行一次函数可以如下操作:

crontab(minute="*/3", hour=23)

这里的每隔 n 分钟,其实是 n 的倍数,比如说 */3 就是在 0,3,6,9,12... 等这些分钟数上执行。

还有一种是范围内的操作方式,比如说,23点的 10-20分钟内每分钟执行一次:

crontab(minute="10-20", hour=23)

那么上面的方式合并起来可不可以,比如说在23点的第5分钟,11分钟,51分钟,31-40分钟,并且每隔两分钟执行一次

也可以实现,把上面的方式都添加在一起,就是一个或的操作:

crontab(minute="5,11,51,10-20,*/2", hour=23)

对于分钟的这些操作,对于小时数是同样生效的,不过范围在 0-23 之间,比如说指定0点,5点,8点,16点的零分执行一次,那就是:

crontab(minute=0, hour="0,5,8,16")

如果是每个小时执行一次呢,就是:

crontab(minute=0, hour="*/1")

# 当 n = 1 的时候 1可以省略,即为
crontab(minute=0, hour="*")

hour 的范围参数和指定的小时点,像 minute 参数一样,也是可以或操作功能那样生效的。

day_of_week

day_of_week 参数表示周几,当我们使用这个参数的时候,minute 和 hour 参数是同样生效的,这里我们只演示 day_of_week 参数的作用,小时和分钟我们都定为 0点0分。

当我们不指定这个参数的时候,即为每天,只有指定了这个参数的时候,定义的周几才会生效,比如我们定义在周一,周三,周五三天的零点执行一次:

crontab(minute=0, hour=0, day_of_week="1,3,5")

这里,周日是0,周一是1,周二是2,依次类推。

day_of_week 的参数还可以使用英文的简写,这里不做介绍,因为我个人认为还是直接使用数字方便一点。

另一个需要注意的是,day_of_week 也可以使用 */n 的形式,但是周几总共只有7个,所以我这里推荐直接用数字写出来。

day_of_month

表示一个月的第几天,范围是1-31。

其使用方法和 minute、hour 使用的方式是一致的,使用范围和 */n 的形式都可以实现。

比如我们想实现在1号,5号,7号,8号,以及每个偶数日的零点零分执行一次,可以这样操作:

crontab(minute=0, hour=0, day_of_month="1,5,7,8,*/2")

month_of_year

表示一年的某几个月,范围是1-12。

和前面的使用方式一致,如果需要使用,只有12个数字,还是推荐直接定义。

如果想获取更多后端相关文章,可扫码关注阅读:

celery笔记七之周期/定时任务及crontab定义的更多相关文章

  1. Celery笔记

    异步任务神器 Celery 简明笔记 2016/12/19 · 工具与框架 · Celery, 异步 原文出处: FunHacks    在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避 ...

  2. Linux 系统定时任务:crontab,anacron

    Linux 系统定时任务:crontab,anacron 一.Cron 服务 1. 启动服务 service cron start 2. 关闭服务 service cron stop 3. 重启服务 ...

  3. Django 如何使用 Celery 完成异步任务或定时任务

    以前版本的 Celery 需要一个单独的库(django-celery)才能与 Django 一起工作, 但从 Celery 3.1 开始,情况便不再如此,我们可以直接通过 Celery 库来完成在 ...

  4. PHP 开发 APP 接口学习笔记与总结 - [ Linux ] 定时任务

    定时任务可以使用 crontab 命令来设定: crontab -e #编辑某个用户的cron 服务 crontab -l  #列出某个用户cron 服务的详细内容 crontab -r  #删除某个 ...

  5. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...

  6. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  7. linux下系统定时任务配置----crontab(mysql定时备份)

    crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...

  8. 定时任务之crontab命令

    1.简介 crontab用于设置周期性被执行的命令 Linux系统中Linux调动工作分为两大类: 1.系统执行的工作:系统周期性所要执行的工作,如备份系统数据.清理缓存 2.个人执行的工作:某个用户 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  10. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

随机推荐

  1. 【Deep Learning】DDPM

    DDPM 1. 大致流程 1.1 宏观流程 1.2 训练过程 1.3 推理过程 2. 对比GAN 2.1 GAN流程 2.2 相比GAN优点 训练过程更稳定,损失函数指向性更强(loss数值大小指示训 ...

  2. Helm 安装 Kubernetes 监控套件

    Helm 安装 Grafana Prometheus Altermanager 套件 安装helm # 安装helm工具 curl -fsSL -o get_helm.sh https://raw.g ...

  3. Java代理之jdk动态代理+应用场景实战

    本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明.之后将以两个最常见的应用场景为例,进行代码实操.这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用.比如在spri ...

  4. tar:Error is not recoverable:exiting now

    问题描述:文件包在不同网络跟介质之间传输,导致文件破损,如何使用md5的方式去对比文件的完整性 tar:Child returned status 1 tar:Error is not recover ...

  5. Django终端打印执行的SQL语句

    1.queries查询 >>>obj = models.User.objects.filter(name='Mcoco')[0] >>>obj.group.name ...

  6. vue3的setup语法糖

    https://blog.csdn.net/weixin_44922480/article/details/127337914 https://blog.csdn.net/m0_63108819/ar ...

  7. js给元素设置样式

    一.style 利用 "[元素].style.[CSS属性名] = [属性值]" 的方法 1 var Box = document.getElementById('box') 2 ...

  8. cat,more,cp,mv,rm,命令

    cat命令 查看文件内容 语法:cat[linux路径] more命令查看文件内容 more命令同样可以查看文件内容, 同cat不同的是: •cat是直接将内容全部显示出来 •more支持翻页,如果文 ...

  9. ImportError: cannot import name 'Bar' from 'pyecharts'

    第一步,先确认运行的py文件名称是否为pyecharts.py,如果是,先换个文件名.再运行改过名称后的py文件,不成功就继续往下看. 第二步,在cmd输入pip list,查看当前pyecharts ...

  10. Solon 用 throw 抛出数据

    此文主要是想在观念上有所拓展.在日常的接口开发时,数据的输出可以有两种方式: 返回(常见) 抛出(可以理解为越级的.越类型的返回) 我们经常会看到类似这样的案例.为了同时支持正常的数据和错误状态,选择 ...