测试CELERYBEAT的例子:
celery_test
|proj
|__init__.py
|celery.py
|email_task.py
|calcu_tasks.py
start_server.sh
|proj_v1
|xxx_task.py
__init__.py为空文件。
celery.py,
#-*-coding=utf-8-*-
from __future__ import absolute_import
from celery import Celery
from celery.schedules import crontab
from kombu import Queue
app = Celery("proj",
broker = "redis://10.121.84.90:16379/6",
include = ['proj.email_task','proj.calcu_tasks'] #!!!!!
)
app.conf.update(
CELERY_DEFAULT_QUEUE = 'default',
CELERY_QUEUES = (Queue('hipri'),),
#CELERY_ROUTES={
#"proj.email_task.do_email":{'queue':'hipri'},
#},
CELERYBEAT_SCHEDULE = {
"do_email":{
"task":"proj.email_task.do_email",
"schedule":crontab(minute="*/1"),
"args":(),
"options":{'queue':'default'}
},
"do_email_new":{
"task":"proj.email_task.do_email_new",
"schedule":crontab(minute="*/1"),
"args":(),
"options":{'queue':'hipri'}
},
"add":{
"task":"proj.calcu_tasks.add",
"schedule":crontab(minute="*/1"),
"args":(3,4),
"options":{'queue':'hipri'}
},
},
)
if __name__ == '__main__':
pass
#app.start()
email_task.py,
from __future__ import absolute_import
import sys
import os
import hashlib
import time
from proj.celery import app
reload(sys)
sys.setdefaultencoding('utf-8')
sys.path.append(os.path.join(os.path.dirname(__file__), "./"))
@app.task()
def do_email():
print 'begin to email'
time.sleep(5)
print 'email complete'
@app.task()
def do_email_new():
print 'begin to email new'
time.sleep(5)
print 'email new complete'
calcu_tasks.py,
from __future__ import absolute_import
import sys
import os
import hashlib
import time
from proj.celery import app
@app.task
def add(x, y):
print '%d + %d = %d'%(x, y, x+y)
start_server.sh,
#!/bin/bash
#nohup celery -A proj worker -n default_worker -c 2 -B -Q default -l debug &
#nohup celery -A proj worker -n hipri_worker -c 2 -B -Q hipri -l debug &
#celery multi start default_worker hipri_worker -A proj -c 2 -B -Q:default_worker default -Q:hipri_worker hipri -l debug
nohup celery -A proj worker -n default_worker -c 2 -Q default -l debug &
nohup celery -A proj worker -n hipri_worker -c 2 -Q hipri -l debug &
nohup celery -A proj beat &
xxx_task.py为随便定义的类似
email_task.py的一个celery服务程序。
1. 经验证,不同目录共享同一个app=Celery()对象是不行的,比如上面例子中proj目录下
celery.py中的app不能共享给proj_v1目录下的
xxx_task.py使用。
2.
nohup celery -A proj worker -n default_worker -c 2 -B -Q default -l debug &
nohup celery -A proj worker -n hipri_worker -c 2 -B -Q hipri -l debug &
上面
用-B选项开启多个worker
的做法,会导致一个任务被执行两次,因为celery beat实例开启了两个。
正确的做法,
nohup celery -A proj worker -n default_worker -c 2 -Q default -l debug &
nohup celery -A proj worker -n hipri_worker -c 2 -Q hipri -l debug &
nohup celery -A proj beat &
也就是说,celery beat实例只应该开启一个。
3. CELERYBEAT_SCHEDULE中实现routing似乎比较简单。
4. 添加celery定时任务,除了手动配置
CELERYBEAT_SCHEDULE,也可以通过函数
add_periodic_task(...)
来完成,详见
http://docs.celeryproject.org/en/master/userguide/periodic-tasks.html 。