Celery任务调度
一、Celery任务调度简单示例
- 环境:Linux,Celery,Flower
- 脚本:tasks.py
- 功能:任务调度;任务运行状态监控和日志显示
- 安装:
- pip install flower
- pip install celery==3.1.25
- redis数据库或者RabbitMQ百度安装吧,不属于python包范畴了。(放消息队列的经纪人,用其中一个就行,更推荐第二种,因为我暂时不会第二种,用了第一种)
- tasks.py代码如下:
1 | from celery import Celery,platforms |
命令行内输入:
1 | celery -A tasks worker -l info |
worker便启动了
此时在文件目录下打开新窗口进入python或者ipython都可以:
1 | > from tasks import add |
这时你在第一个窗口就能看到效果了。
flower监控
这玩意是干啥的呢?
就是消息队列啥的都让他在浏览器上显示
第一种方法:
- 在tasks.py同级目录执行
celery flower -A tasks --address=127.0.0.1 –-port=5555
,启动worker,绑定flower监控并设置监控端口; - 或者开两个进程分别执行
celery -A tasks worker -l info和celery -A tasks flower –port=5555
,效果也一样。
worker启动后,另开进程进入task.py目录,执行如下代码,会在localhost:5555
的监控页面看到tasks运行结果。
第二种方法
- celery flower –broker=amqp://用户名:密码@localhost:5672// 或
- celery flower –broker=redis://用户名:密码@localhost:6379/0
访问 http://localhost:5555/ 即可。
二.Celery定时任务示例
- 脚本:tasks.py,config.py(配置文件)
- 功能:Crontab定时,Periodic Task
tasks.py代码如下:
1 | from celery import Celery,platforms |
config.py代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25from __future__ import absolute_import #如果没有这一行,下一行可能会出错
from celery.schedules import crontab
from datetime import timedelta
BROKER_URL = 'amqp://public:qfZjSmJjDs51EyIk@192.168.12.103:5672/'
# Crontab定时任务的设置方式
# CELERYBEAT_SCHEDULE = {
# 'every-minute': {
# 'task': 'tasks.add',
# 'schedule': crontab(minute='*/1'), #crontab的参数设置见后面
# 'args': (1,2),
# },
# }
# Periodic task的设置方式
CELERYBEAT_SCHEDULE = {
'add-every-2-seconds': {
'task': 'tasks.add',
'schedule': timedelta(seconds=2),
'args': (16, 10),
},
}
CELERY_TIMEZONE = 'UTC' #时区设置,也可以为'Europe/London'
- 在脚本同级目录执行
celery -A tasks worker -B
,即启动worker和beat服务; - 或者先用
celery -A proj worker –loglevel=INFO
启动worker,再用celery -A tasks beat -s celerybeat-schedule
#这里的celerybeat-schedule指定一个记录文件**启动beat服务也行。
同上也可以用浏览器打开localhost:8083
查看tasks运行状态与详细日志
写法 | 含义 |
---|---|
crontab() | 每分钟执行 |
crontab(minute=0, hour=0) | 每天午夜执行 |
crontab(minute=0, hour=’*/3’) | 每三个小时执行: 午夜, 3am, 6am, 9am, 正午, 3pm, 6pm, 9pm. |
crontab(minute=0,hour=’0,3,6,9,12,15,18,21’) | 同上 |
crontab(minute=’*/15’) | 每15分钟执行 |
crontab(day_of_week=’sunday’) | 星期日每分钟 |
crontab(minute=’‘,hour=’‘, day_of_week=’sun’) | 同上 |
crontab(minute=’*/10’,hour=’3,17,22’, day_of_week=’thu,fri’) | 每10分钟执行,仅限于周六日3-4 am, 5-6 pm, and 10-11 pm |
crontab(minute=0, hour=’/2,/3’) | 偶数小时或者能被3整除的小时数执行 |
crontab(minute=0, hour=’*/5’) | 被5整除的小时数,如3pm |
crontab(minute=0, hour=’*/3,8-17’) | 8am-5pm能被3整除的 |
crontab(0, 0, day_of_month=’2’) | 每月第2天 |
crontab(0, 0,day_of_month=’2-30/3’) | 每偶数天 |
crontab(0, 0,day_of_month=’1-7,15-21’) | 每月1和3周 |
crontab(0, 0, day_of_month=’11’,month_of_year=’5’) | 每年5月11日 |
crontab(0, 0,month_of_year=’*/3’) | 每个季度第1月 |