Django Celery定时任务和时间设置
1、Celery加入定时任务
Celery除了可以异步执行任务之外,还可以定时执行任务。在实例代码的基础上写个测试方法:
- #coding:utf-
- from celery.task.schedules import crontab
- from celery.decorators import periodic_task
- @periodic_task(run_every=crontab())
- def some_task():
- print('periodic task test!!!!!')
- time.sleep()
- print('success')
- return True
该代码是每分钟执行一次some_task方法。
启动celery是使用worker。但worker不能启动定时任务。启动方式如下:
1)先确保中间人是否打开,我使用redis作为中间人。可参考Redis在CentOS和Windows安装过程。
2)进入django项目的根目录执行如下代码启动celery的worker:
- celery -A myproject worker -l info
其中,myproject是我的django项目名称。
当出现celery@xxx ready说明redis启动成功。
有两个任务,其中一个myapp.tasks.sendmail添加的异步处理任务。myapp.tasks.some_task是本次的定时任务。
3)同样在django项目的根目录下再打开一个命令行界面,执行如下代码:
- celery -A myproject beat -l info
这个beat是检查定时任务,并启动定时任务丢给worker执行。
可以稍微等待几分钟,多执行几次任务。如下图:
上面的窗口是beat,下面的窗口是worker。可看到print的信息在worker中输出。
我们甚至不用打开Django项目的服务器,就可以执行定时任务。
2、Celery定时任务时间设置
若你觉得1分钟等待时间太长。可以设置为每10秒执行一次定时任务。将上面的periodic_task修改如下:
- @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设置,代码如下:
- from celery.decorators import periodic_task
- import datetime
- @periodic_task(run_every=datetime.timedelta(hours=1, minutes=15, seconds=40))
- def some_task():
- print('periodic task test!!!!!')
代码可读性明显提升,而且设置方便。
但这种不能满足定时定点的时间设置。假如我想固定每天12点15分的时候,执行一次任务。datetime和直接设置秒数的方式都无法实现。这时得使用第3种方式。
3)celery的crontab表达式
crontab是比较完善,且稍微有点复杂(相对前面两种方式而言)的方式。可以实现我们各种设置时间的需求。
例如,前面给出的代码:
- #coding:utf-8
- from celery.task.schedules import crontab
- from celery.decorators import periodic_task
- @periodic_task(run_every=crontab())
- def some_task():
- 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()相当与:
- crontab(minute='*', hour='*', day_of_week='*', day_of_month='*', month_of_year='*')
含义是每天、每小时、每分钟执行一次任务。这说法太反人类语言习惯,简单说就是每1分钟执行一次任务。
b、具体某个值
上面提到这些参数的取值范围。我们可以直接设置某个值。例如:
- crontab(minute=15)
即每小时的15分时刻执行一次任务。直接指定某个时刻。以此类推可以设置每天0点0分时刻执行任务的设置如下:
- crontab(minute=0, hour=0)
当然,也可以设置多个值。例如0分和30分执行一次任务:
- crontab(minute='0,30')
这里使用字符串,用逗号隔开数值。这里的逗号是表示多个表达式or逻辑关系。
c、设置范围
设置范围也是设置多个值,例如指定9点到12点每个小时的每分钟执行任务。
- crontab(minute='*', hour='9-12')
这里*号是默认值,可以省略如下:
- crontab(hour='9-12')
上面提到逗号是or逻辑关系。拓展一下,指定9点到12点和20点中每分钟执行任务:
- crontab(hour='9-12,20')
crontab的表达式越来越复杂了。celery还提供了一个类得到表达式解析结果,代码如下:
- from celery.task.schedules import crontab_parser
- r = crontab_parser(23, 0).parse('9-12,20')
- print(r)
其中,crontab_parse是一个解析类。第1个参数是范围的最大值;第2个参数是范围的最小值。通过parse输入表达式,可得到表达式的解析结果:
- set([9, 10, 11, 12, 20])
下面很多地方我们都可以通过该方法验证解析结果。
d、设置间隔步长
假如我要设置1、3、5、7、9、11月份每天每分钟执行任务,按照上面的做法可以设置如下:
- crontab(day_of_month='1,3,5,7,9,11')
观察数据可以发现,都是间隔2的步长。需要设置的数字比较少,若数字比较多显得很麻烦。例如我想每间隔2分钟就执行一次任务,要写30个数字想想就觉得很麻烦。crontab表达式还提供了间隔的处理,例如:
- crontab(minute='*/2')
- crontab(minute='0-59/2') #效果等同上面
这个/号不是除以的意思。相当与range的第3个参数,例如:
- range(0, 59+1, 2)
差不多crontab表达式就这些,多举几个例子:
- #每2个小时中每分钟执行1次任务
- crontab(hour='*/2')
- #每3个小时的0分时刻执行1次任务
- #即[0,3,6,9,12,15,18,21]点0分
- crontab(minute=0, hour='*/3')
- #每3个小时或8点到12点的0分时刻执行1次任务
- #即[0,3,6,9,12,15,18,21]+[8,9,10,11,12]点0分
- crontab(minute=0, hour='*/3,8-12')
- #每个季度的第1个月中,每天每分钟执行1次任务
- #月份范围是1-12,每3个月为[1,4,7,10]
- crontab(month_of_year='*/3')
- #每月偶数天数的0点0分时刻执行1次任务
- crontab(minute=0, hour=0, day_of_month='2-31/2')
- #每年5月11号的0点0分时刻执行1次任务
- crontab(0, 0, day_of_month='', month_of_year='')
Django Celery定时任务和时间设置的更多相关文章
- Bamboo Django Celery定时任务和时间设置
1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...
- quartz定时任务及时间设置
quartz 定时任务时间设置1.这些星号由左到右按顺序代表 : * * * * * * * ...
- C# Quartz定时任务corn时间设置详解
http://cron.qqe2.com/ 如果不会 或者想检验自己是否写的对就 通过这个网站 检测 或自动生成 * * * * * * ...
- django celery 定时任务
可参考上一篇:http://www.cnblogs.com/wumingxiaoyao/p/8515075.html 1. 安装 django-celery-beat pip3 install dja ...
- django celery redis 定时任务
0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择. cele ...
- django+celery+redis实现运行定时任务
0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择. cele ...
- celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)
一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...
- Django+Celery框架自动化定时任务开发
本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本.业务场景接口自动化测试脚本.App自动化测试脚本.Web自动化 ...
- Django+Celery+xadmin实现异步任务和定时任务
Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...
随机推荐
- BZOJ3434 WC2014时空穿梭(莫比乌斯反演)
考虑枚举相邻点距离差的比例.显然应使比例值gcd为1以保证不重复统计.确定比例之后,各维坐标的方案数就可以分开考虑.设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/ ...
- C++11 自动推导auto
C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准 ...
- 【Revit API】创建共享参数
话不多说,直接上代码 var app = doc.Application; app.SharedParametersFilename = sharedParamFilePath; Definition ...
- 【BZOJ1295】[SCOI2009]最长距离(最短路)
[BZOJ1295][SCOI2009]最长距离(最短路) 题面 BZOJ 洛谷 题解 这题很妙啊. 我们枚举一个点,只需要考虑到他的最远点就行了,显然只需要考虑一个点即可.那么这两个点之前联通的最小 ...
- Dubbo学习笔记5:Dubbo整体框架分析
Dubbo的分层架构 本文将简单介绍Dubbo的分层架构设计,如下图是Dubbo官方的整体架构图: Dubbo官方提供的该架构图很复杂,一开始我们没必要深入细节,下面我们简单介绍下其中的主要模块. 其 ...
- 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用
通配符 T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值 ? 未知类型 类型参数赋予不确定值, 任意类型 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上 上限 extends ...
- 面板支持单个,多个元素的jQuery图片轮播插件
一.先附上demo <!doctype html> <html> <head> <meta charset="utf-8"> < ...
- Oracle 查看锁表进程_杀掉锁表进程 [转]
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...
- 20155226 2016-2017-2 《Java程序设计》第6周学习总结
20155226 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 10.1 InputStream与OutputStream 1 . 串流 ...
- NOIP2016-D2-T2 蚯蚓(单调队列)
构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性. 证明:设$q$为单调队列$\because a_1 \geqslant a_2 \geqslant ...