# celery_demo/tasks/period_task1.py
from celery.schedules import crontab
from app import app
# 此时也不需显式导入任务工厂了
# 直接以字符串的方式指定即可
app.conf.beat_schedule = {
# 参数通过 args 和 kwargs 指定
"每10秒执行一次": {"task": "tasks.task1.task1",
"schedule": 10.0},
"每15秒执行一次": {"task": "tasks.task1.task2",
"schedule": 15.0,
"args": ("task2",)},
"每20秒执行一次": {"task": "tasks.task1.task3",
"schedule": 20.0},
"每个星期天的18:05运行一次": {"task": "tasks.task1.task4",
"schedule": crontab(hour=18,
minute=5,
day_of_week=0),
"args": ("task4",)}
}
需要注意:虽然我们不用显式导入任务工厂 , 但其实是 celery 自动帮我们导入 。由于这些任务工厂都位于 celery_demo/tasks/task1.py 里面 , 而 worker 也是在 celery_demo 目录下启动的 , 所以需要指定为 tasks.task1.task{1234} 。
这种启动方式也是可以成功的 , 貌似还更方便一些 , 但是会多出一个文件 , 用来存储配置信息 。
文章插图

文章插图
crontab 参数
定时任务除了指定一个浮点数之外(表示每隔多少秒执行一次) , 还可以指定 crontab 。关于 crontab 应该都知道是什么 , 我们在 linux 上想启动定时任务的话 , 直接 crontab -e 然后添加即可 。
而 celery 的 crontab 和 Linux 高度相似 , 我们看一下函数原型就知道了 。
文章插图
简单解释一下:
-
minute:0-59 , 表示第几分钟触发 , * 表示每分钟触发一次;
-
hour:0-23 , 表示第几个小时触发 , * 表示每小时都会触发 。比如 minute=2, hour=* , 表示每小时的第二分钟触发一次;
-
day_of_week:0-6 , 表示一周的第几天触发 , 0 是星期天 , 1-6 分别是星期一到星期六 , 不习惯的话也可以用字符串 mon,tue,wed,thu,fri,sat,sun 表示;
-
month_of_year:当前年份的第几个月;
以上就是这些参数的含义 , 并且参数接收的值还可以是一些特殊的通配符:
-
*:所有 , 比如 minute=* , 表示每分钟触发;
-
*/a:所有可被 a 整除的时候触发;
-
a-b:a 到 b范围内触发;
-
a-b/c:范围 a-b 且能够被 c 整除的时候触发;
-
2,10,40:比如 minute=2,10,40 表示第 2、10、40 分钟的时候触发;
通配符之间是可以自由组合的 , 比如 */3,8-17 就表示能被 3 整除 , 或范围处于 8-17 的时候触发 。
除此之外 , 还可以根据天色来设置定时任务(有点离谱) 。
from celery.schedules import solar
app.conf.beat_schedule = {
"日落": {"task": "task1",
"schedule": solar("sunset",
-37.81753,
144.96715)
},solar 里面接收三个参数 , 分别是 event、lat、lon , 后两个比较简单 , 表示观测者所在的纬度和经度 。值大于 0 , 则对应东经/北纬 , 小于 0 , 则对应西经/南纬 。
我们重点看第一个参数 event , 可选值如下:
推荐阅读
- 龙之家族|《龙之家族》这1细节,暗示了丹妮莉丝,才是最伟大的坦格利安?
- 小米|37岁财富自由!雷军接受央视采访:我要成伟大的人 小米要影响世界、造车是被逼的
- 中国最大的岛屿是日本岛 中国最大的岛屿是什么岛-张雪峰
- 盛明兰|重温《知否》,王老太师一生最大的败笔,就是娶了偏心的王老太太
- 韩剧|《当你沉睡时》:当噩梦照进现实,救赎和信任才是最强的陪伴
- 赵鹏翔|“李易峰”事件最大的受益者是谁?
- 罚罪|《罚罪》:大王现身,是全剧最大的反转吗,网友:不是的
- |能力,让一个人迅速脱颖而出,如何发挥出你的最强技能?
- 华为|喷问界M7不好看的人品位比较Low!余承东:华为做伟大的设计
- 最大的恐龙有多大 最大的恐龙排行榜前十名
