前言
最近开始接触python,并且在业务需要的情况下开始寻找任务调度的框架。最后选择了celery,在这里记录一下搭建的过程。
服务器是debian系统。
官方文档:http://www.celeryproject.org/
github:https://github.com/celery/celery
安装环境
pip install celery
pip install flower #监控软件,包括图形界面
pip install supervisor #linux进程管理工具
这里我的broker使用的是redis,安装过程略
环境配置
redis配置
建立一个文件夹,在里面添加redis.conf(修改端口为8765)和start.sh
# start.sh
cd /opt/redis/8765/
/usr/bin/redis-server ./redis.conf
设置系统自启动
vi /etc/rc.local
/bin/bash /opt/redis/8765/start.sh #添加此行,系统自启动
supervisor配置
# 生成默认配置文件
echo_supervisord_conf > /etc/supervisord.conf
mkdir /etc/supervisord.conf.d
vi supervisord.conf # 具体内容可以参考官方的[例子](https://github.com/celery/celery/tree/master/extra/supervisord),
vi celery.conf # 同上
使用 supervisord -c supervisord.conf启动
关键操作
通过反复看官方文档,在这里记录下自己使用到的并测试了代码
# 创建一个应用
app = Celery('proj',
broker='redis://127.0.0.1:6379/0',
backend='redis://127.0.0.1:6379/0',
include=['proj.tasks'])
def my_on_failure(self, exc, task_id, args, kwargs, einfo):
pass
app.conf.update(
CELERY_TASK_RESULT_EXPIRES=30, # 结果保存时间
CELERY_TASK_SERIALIZER = 'json', # 格式序列化
CELERY_RESULT_SERIALIZER = 'json',
CELERY_TIMEZONE = 'Asia/Shanghai',
CELERY_ANNOTATIONS = {'*': {'on_failure': my_on_failure}} # 自定义错误处理,可参考地址:http://docs.celeryproject.org/en/latest/userguide/tasks.html#abstract-classes
)
# 定时任务
app.conf.CELERYBEAT_SCHEDULE = {
'add-every-1-min': {
'task': 'proj.tasks.add',
'schedule': timedelta(seconds=10), # 可以使用小数
# 'schedule':crontab(minute=9,hour=18,day_of_month='*'), #支持crontab方式
'args': (16,16) # 传递参数
},
}
#具体可参考:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#crontab-schedules
#错误重试
# 参考地址:http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.retry
@app.task(name='task.add',bind=True)
def add(self,x, y):
# print 0
try:
1/0
except Exception as exc:
raise self.retry(countdown=5,max_retries=6, exc=exc)
return x + y
Queue 我还没有用到,有时间再加进去
后续
这段时间准备尝试一下queue相关知识,所以搭建了rabbitmq,这里就简单记录一下过程好了
我很多操作都是参照这篇博客进行的http://blog.csdn.net/huoyunshen88/article/details/33738393
我的基础环境是debian,我的安装过程很简单
1,apt-get install erlang erlang-nox
2,下载 rabbit.deb,去官网找即可(http://www.rabbitmq.com/install-debian.html),到相应目录后使用 dpkg -i *.deb进行安装
3,参照http://celery.readthedocs.io/en/latest/userguide/routing.html进行修改
其他:
在使用的过程中主要需要注意两点
1,需要先 了解一下AMPQ的基本概念,然后参考http://www.rabbitmq.com/getstarted.html 进行一下操作,这样才能明白exchange,queue等参数的概念和意义
2,在部署的时候如果想改变默认端口,以及rabbitmq-management的默认端口,需要修改rabbitmq.conf(这个文件默认是没有的,需要自己创建),可以去https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.config.example下载一份,里面的参数基本就是json格式的,很好理解