1、Celery加入定时任务

Celery除了可以异步执行任务之外,还可以定时执行任务。在实例代码的基础上写个测试方法:

 1 #coding:utf-8
2 from celery.task.schedules import crontab
3 from celery.decorators import periodic_task
4
5 @periodic_task(run_every=crontab())
6 def some_task():
7 print('periodic task test!!!!!')
8 time.sleep(5)
9 print('success')
10 return True

该代码是每分钟执行一次some_task方法。

启动celery是使用worker。但worker不能启动定时任务。启动方式如下:

1)先确保中间人是否打开,我使用redis作为中间人。可参考Redis在CentOS和Windows安装过程。

2)进入django项目的根目录执行如下代码启动celery的worker:

1 celery -A myproject worker -l info

其中,myproject是我的django项目名称。

当出现celery@xxx ready说明redis启动成功。

有两个任务,其中一个myapp.tasks.sendmail添加的异步处理任务。myapp.tasks.some_task是本次的定时任务。

3)同样在django项目的根目录下再打开一个命令行界面,执行如下代码:

1 celery -A myproject beat -l info

这个beat是检查定时任务,并启动定时任务丢给worker执行。

可以稍微等待几分钟,多执行几次任务。如下图:

上面的窗口是beat,下面的窗口是worker。可看到print的信息在worker中输出。

我们甚至不用打开Django项目的服务器,就可以执行定时任务。

2、Celery定时任务时间设置

若你觉得1分钟等待时间太长。可以设置为每10秒执行一次定时任务。将上面的periodic_task修改如下:

1 @periodic_task(run_every=10)

修改代码,需要重启Celery的worker和beat。

这个run_every参数是设置定时任务的时间间隔或执行的时间。该参数设置有3种方式。

1)直接设置秒数

例如刚刚所说的10秒间隔,run_every=10,每10秒执行一次任务。1分钟即是60秒;1小时即是3600秒。

2)通过datetime设置时间间隔

有时直接设置秒数不方便,需要通过计算得到具体秒数。

例如,1小时15分钟40秒 = 1*60*60 + 15*60 + 40。这种情况可读性也不高。

可以采用datetime设置,代码如下:

1 from celery.decorators import periodic_task
2 import datetime
3
4 @periodic_task(run_every=datetime.timedelta(hours=1, minutes=15, seconds=40))
5 def some_task():
6 print('periodic task test!!!!!')

代码可读性明显提升,而且设置方便。

但这种不能满足定时定点的时间设置。假如我想固定每天12点15分的时候,执行一次任务。datetime和直接设置秒数的方式都无法实现。这时得使用第3种方式。

3)celery的crontab表达式

crontab是比较完善,且稍微有点复杂(相对前面两种方式而言)的方式。可以实现我们各种设置时间的需求。

例如,前面给出的代码:

1 #coding:utf-8
2 from celery.task.schedules import crontab
3 from celery.decorators import periodic_task
4
5 @periodic_task(run_every=crontab())
6 def some_task():
7 print('periodic task test!!!!!') 

表示每分钟0秒时刻执行一次(后面不提这个0秒,大家都知道就行了,省点口水)。

其中,crontab()实例化的时候没设置任何参数,都是使用默认值。crontab一共有7个参数,常用有5个参数分别为:

minute:分钟,范围0-59;

hour:小时,范围0-23;

day_of_week:星期几,范围0-6。以星期天为开始,即0为星期天。这个星期几还可以使用英文缩写表示,例如“sun”表示星期天;

day_of_month:每月第几号,范围1-31;

month_of_year:月份,范围1-12。

a、默认参数

这些参数可以设置表达式,表达稍微复杂的设置。默认值都是"*"星号,代表任意时刻。即crontab()相当与:

1 crontab(minute='*', hour='*', day_of_week='*', day_of_month='*', month_of_year='*')

含义是每天、每小时、每分钟执行一次任务。这说法太反人类语言习惯,简单说就是每1分钟执行一次任务。

b、具体某个值

上面提到这些参数的取值范围。我们可以直接设置某个值。例如:

1 crontab(minute=15)

即每小时的15分时刻执行一次任务。直接指定某个时刻。以此类推可以设置每天0点0分时刻执行任务的设置如下:

1 crontab(minute=0, hour=0)

当然,也可以设置多个值。例如0分和30分执行一次任务:

crontab(minute='0,30')

这里使用字符串,用逗号隔开数值。这里的逗号是表示多个表达式or逻辑关系。

c、设置范围

设置范围也是设置多个值,例如指定9点到12点每个小时的每分钟执行任务。

1 crontab(minute='*', hour='9-12')

这里*号是默认值,可以省略如下:

1 crontab(hour='9-12')

上面提到逗号是or逻辑关系。拓展一下,指定9点到12点和20点中每分钟执行任务:

1 crontab(hour='9-12,20')

crontab的表达式越来越复杂了。celery还提供了一个类得到表达式解析结果,代码如下:

1 from celery.task.schedules import crontab_parser
2 r = crontab_parser(23, 0).parse('9-12,20')
3 print(r)

其中,crontab_parse是一个解析类。第1个参数是范围的最大值;第2个参数是范围的最小值。通过parse输入表达式,可得到表达式的解析结果:

1 set([9, 10, 11, 12, 20])

下面很多地方我们都可以通过该方法验证解析结果。

d、设置间隔步长

假如我要设置1、3、5、7、9、11月份每天每分钟执行任务,按照上面的做法可以设置如下:

1 crontab(day_of_month='1,3,5,7,9,11')

观察数据可以发现,都是间隔2的步长。需要设置的数字比较少,若数字比较多显得很麻烦。例如我想每间隔2分钟就执行一次任务,要写30个数字想想就觉得很麻烦。crontab表达式还提供了间隔的处理,例如:

1 crontab(minute='*/2')
2 crontab(minute='0-59/2') #效果等同上面

这个/号不是除以的意思。相当与range的第3个参数,例如:

1 range(0, 59+1, 2)

差不多crontab表达式就这些,多举几个例子:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

来自https://www.cnblogs.com/dengshihuang/p/8258621.html

Bamboo Django Celery定时任务和时间设置的更多相关文章

  1. Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: #coding:utf- from celery.task.schedules ...

  2. quartz定时任务及时间设置

    quartz 定时任务时间设置1.这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                               ...

  3. C# Quartz定时任务corn时间设置详解

    http://cron.qqe2.com/  如果不会 或者想检验自己是否写的对就  通过这个网站 检测 或自动生成 *    *         *     *      *      *      ...

  4. django celery 定时任务

    可参考上一篇:http://www.cnblogs.com/wumingxiaoyao/p/8515075.html 1. 安装 django-celery-beat pip3 install dja ...

  5. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  6. django+celery+redis实现运行定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  7. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  8. Django+Celery框架自动化定时任务开发

    本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本.业务场景接口自动化测试脚本.App自动化测试脚本.Web自动化 ...

  9. Django+Celery+xadmin实现异步任务和定时任务

    Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...

随机推荐

  1. PHP array_count_values()

    定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键(索引)是原数组的值,元素的值是该值在原数组中出现的次数. 语法 array_ ...

  2. Ubuntu下调整时区时间

    Ubuntu下调整时区时间 学习了:http://blog.csdn.net/jintiaozhuang/article/details/38583031 进行了tzselect错误的修复 学习了:h ...

  3. c/c++ 数据结构之位图(bitmap)具体解释

    1.  概述 位图(bitmap)是一种很经常使用的结构,在索引.数据压缩等方面有广泛应用. 本文介绍了位图的实现方法及其应用场景. 2. 位图实现 2014728101320" alt=& ...

  4. SIS

    故障: 1.2017-12-14  发现前期测试的钉钉切换校区功能有遗留问题,第二个校区进行考勤后,在考勤记录中编辑考勤记录,出现无权限 原因:编辑考勤记录,传的schoolid不是原先的school ...

  5. warning: here-document at line 7 delimited by end-of-file (wanted `rui')

  6. django自带权限控制系统的使用和分析

    1.django的权限控制相关表及其相互间的关系: django的所有权限信息存放在auth_permission表中,用户user和用户组group都可以有对应的权限permission.分别存放在 ...

  7. 第2章 安装Nodejs 2-2 Nodejs版本常识

  8. php的self this parent的区别

    {一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行P ...

  9. BZOJ 4195 程序自动分析

    4195: [Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表 ...

  10. Spring Boot (19) servlet、filter、listener

    servlet.filter.listener,在spring boot中配置方式有两种:一种是以servlet3开始提供的注解方式,另一种是spring的注入方式. servlet注解方式 serv ...