celery 定时任务时间篇
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表达式就这些,多举几个例子:
1 #每2个小时中每分钟执行1次任务
2 crontab(hour='*/2')
3
4 #每3个小时的0分时刻执行1次任务
5 #即[0,3,6,9,12,15,18,21]点0分
6 crontab(minute=0, hour='*/3')
7
8 #每3个小时或8点到12点的0分时刻执行1次任务
9 #即[0,3,6,9,12,15,18,21]+[8,9,10,11,12]点0分
10 crontab(minute=0, hour='*/3,8-12')
11
12 #每个季度的第1个月中,每天每分钟执行1次任务
13 #月份范围是1-12,每3个月为[1,4,7,10]
14 crontab(month_of_year='*/3')
15
16 #每月偶数天数的0点0分时刻执行1次任务
17 crontab(minute=0, hour=0, day_of_month='2-31/2')
18
19 #每年5月11号的0点0分时刻执行1次任务
20 crontab(0, 0, day_of_month='11', month_of_year='5')
celery 定时任务时间篇的更多相关文章
- celery 定时任务
用celery定时任务,定时删除文件夹 tasks.py from celery import Celery import os import shutil app = Celery('demo') ...
- 将celery定时任务设置为根据本地时区触发
默认celery的时区为UTC,如果要在django项目中将celery定时任务配置为根据本地时区触发,则需要修改 在setttings.py 添加以下任意一行: # celery 相关配置 CELE ...
- Django Celery定时任务和时间设置
1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: #coding:utf- from celery.task.schedules ...
- Bamboo Django Celery定时任务和时间设置
1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...
- celery 定时任务,使用crontab表达式不执行(版本4.3.x)
celery 定时任务,使用crontab表达式不执行(版本4.3.x) 在使用celery 执行定时任务时,发现任务不会执行,schedule设置如下: 经测试,如果去掉hour,则任务每分钟都会执 ...
- Celery定时任务细讲
Celery定时任务细讲 一.目录结构 任务所在目录 ├── celery_task # celery包 如果celery_task只是建了普通文件夹__init__可以没有,如果是包一定要有 │ ├ ...
- celery定时任务
from celery import Celery from datetime import timedelta app = Celery('gx', broker='redis://localhos ...
- 五分钟看懂Celery定时任务
Django下使用Celery 使用场景: 1, Web应用. 当用户触发的一个操作需要很长时间才能执行完成,那么就可以把它当做一个任务去交给Celery去异步执行, 执行完成之后再返回给用户,这短时 ...
- Django-如何写好一个celery定时任务
1.首先在项目同名目录下建一个celery.py from __future__ import absolute_import import os from celery import Celery ...
随机推荐
- python的排序方式
""" 冒泡排序: 冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置 比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, ...
- 执行Git命令时出现各种 SSL certificate problem 的解决办法
执行Git命令时出现各种 SSL certificate problem 的解决办法 来源 https://www.cnblogs.com/chenzc/p/5842932.html 比如我在win ...
- My Todo-List
有些事情要明着写出来才会去干. 这里是一个不断更新的Todo-List,大致按照重要度和列出时间排序. 主要着眼短期计划,其中的大部分事务应该在一周内解决,争取不做一只鸽子. 填好模板库的坑. 学习树 ...
- 数据库MySQL——安装
MySQL 安装 Mysql安装: 1.通过二进制的方式安装 二进制安装方式中,包括rpm版本以及glibc版本. rpm版本就是在特定linux版本下编译的,如果你的linux版本匹配,就可以安装; ...
- PLsql快捷键
plsql使用技巧 1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动 ...
- Linux(Centos)设置ip
一.Linux(Centos7)安装完毕后,重启电脑后,输入用户名(root),密码(**********). 在命令行中输入nmtui命令.选择Edit a connection,选择对应的链接端口 ...
- vue的计算属性与方法的不同
计算属性 vue的模板里可以使用表达式,但是它的设计初衷是用于简单计算,在模板中放入太多逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...
- Oracle DB Day02(SQL)
--数据库下表一般都是从1开始,例如字符串等 SELECT *FROM employees --字符串连接CONCAT() ,CONCAT(CONCAT(EMPLOYEE_ID,','),SALARY ...
- VS注释快捷键
注释: 先CTRL+K,然后CTRL+C 取消注释: 先CTRL+K,然后CTRL+U 代码自动对齐:1, ctrl+a 2, ctrl+k 3, ctrl+f
- 错误: ‘shared_ptr’ in namespace ‘std’ does not name a type的解决方法。
这是因为要使用C++11的标准编译,而catkin_make时无法识别出来. 修改方法是在CMakeLists.txt文件里面添加: set(CMAKE_CXX_FLAGS "${CMAKE ...