Celery定时任务
在celery中执行定时任务非常简单,只需要设置celery对象的CELERYBEAT_SCHEDULE属性即可。
下面我们接着上面的代码,在celeryconfig.py中添加CELERYBEAT_SCHEDULE变量:
CELERY_TIMEZONE = 'UTC'
CELERYBEAT_SCHEDULE = {
'taskA_schedule' : {
'task':'tasks.taskA',
'schedule': crontab(minute=30, hour=5),
'args':(5,6)
}
}
每天的凌晨5点执行taskA 任务。
启动worker
celery worker -A src.task --loglevel=info -Q test_celery_queue -f /data/test.celery/celery.log
启动celery beat
celery beat -A src.app --loglevel=info --logfile=/data/test.celery/celery.beat.log
使用supervisor
[group:test_celery]
programs = test_celery.async,test_celery.beat
[program:test_celery.async]
command=/data/test.celery/env/bin/celery worker -A src.app --loglevel=info -Q test_celery_queue
numprocs=1
numprocs_start=0
priority=999
autostart=true
startsecs=3
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=60
directory=/data/test.celery
user=www-data
stopasgroup=false
killasgroup=false
redirect_stderr=true
stdout_logfile=/data/log/test.celery/test_celery.log
stdout_logfile_maxbytes=250MB
stdout_logfile_backups=10
stderr_logfile=/data/log/test.celery/test_celery.err
stderr_logfile_maxbytes=250MB
stderr_logfile_backups=10
environment=PYTHONPATH='/data/test.celery/';C_FORCE_ROOT="true"
[program:test_celery.beat]
command=/data/test.celery/env/bin/celery beat -A src.app --loglevel=info
numprocs=1
numprocs_start=0
priority=999
autostart=true
startsecs=3
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=60
directory=/data/test.celery
user=www-data
stopasgroup=false
killasgroup=false
redirect_stderr=true
stdout_logfile=/data/log/test.celery/test_celery.beat.log
stdout_logfile_maxbytes=250MB
stdout_logfile_backups=10
stderr_logfile=/data/log/test.celery/test_celery.beat.err
stderr_logfile_maxbytes=250MB
stderr_logfile_backups=10
environment=PYTHONPATH='/data/test.celery/';C_FORCE_ROOT="true"
简单说明
- test_celery.async 和 test_celery.beat
是两个program,分别对应worker和beat,而它们又同属于 test_celery 这个组,这样便于同时管理。 - 注意到command参数了吗?因为我使用了virtualenv来隔离每个项目的包环境,所以需要明确指出
celery命令所在的目录(如果全局安装了celery就必要了), 这也是为什么上文项目结构中会有一个 env 文件夹的原因。 - 使用了虚拟环境之后, 通常需要先激活环境 source /data/test.celery/env/bin/activate
- environment 下设置 PYTHONPATH
我们在上文中提到过。总之,你要让Python知道你项目包得位置,设置PYTHONPATH 只是一种方式。
(supervisorctl) 管理程序进程
通过 sudo supervisorctl 可以进入管理客户端。我们可以使用各种命令管理程序的进程:
常用的命令有:
status 查看状态
restart 重新启动
start 启动
stop 停止
update 更新配置
也可以不进入来管理 ,例如每次更新玩配置,我们可以使其快速生效:
sudo supervisorctl update