背景介绍
celery 简介
其实celery不是消息队列,是一任务异步调用及定时任务调用处理的工具,并提供了后端存储,整合消息队列, 象rabbitmq ,redis。提供很多常用的功能。
sanic 简介
sainc 是一个web框架,并发性很强,基于 uvloop事件处理。
封装一起的意义
项目中,常常需要定时任务处理,临时用了crontab。也需要异步处理,临时基于redis写了一个队列,虽功能都暂时满足实现。
但是,如果这些需求多了,这些就显得很乱,对于高并发,没有很好的承载。
整合sanic和celery就很有必要。sanic提供api, celery处理异步任务和定时任务。flower作任务监控工具。
项目结构
celery架构
稍微深入的celery说明
celery 配置方式
基本默认方式
app = Celery('tasks', broker='redis://127.0.0.1/12', backend='redis://127.0.0.1/13')
配置文件方式
app.config_from_object("celery_config")
类加载方式
app.config_from_object(Config)
具体可参考官方文档
http://docs.celeryproject.org/en/latest/userguide/configuration.html
celery 启动方式
多个队列一起启动
celery -A celery_queue worker -l info -Q default,priority_high,priority_low -c 5 -P eventlet
也可以单独启动或是在不同的虚拟环境中启动
启动定时任务
celery -A celery_queue beat
启动flower监控任务队列执行情况
celery flower -A celery_queue --basic_auth=hugo:3456
参考官方文档
https://flower.readthedocs.io/en/latest/
要点总结
- 可以基于默认队列配置或自定义队列
- 如果是自定队列,就要在启动的时候指定异步加入的队列或是装饰器方式
# 任务加入队列
task_routes = {
'celery_queue.scheduler_task_1': {'queue': 'priority_high', 'routing_key': 'priority_high'},
'celery_queue.scheduler_task_2': {'queue': 'priority_low', 'routing_key': 'priority_low'}
}
# 装饰器方式指定
@app.task(queue="default", name="remote_comm_task_call")
def task_call(*args, **kwargs):
logger.info("logging test")
return "celery queue exec success"
-
return xxx 并不是返回的结果,而是写入存储的result,返回的是队列对象,里面包含队列id,状态,结果等等信息
还有实用的功能, 项目中用到,再慢慢加入
比如执行重试,异常处理,处理时间.......
参考
http://docs.celeryproject.org/en/latest/index.html
https://flower.readthedocs.io/en/latest/
https://www.jianshu.com/p/66707b1e7787
CELERY 相关函数介绍
https://www.jianshu.com/p/3833f0f07be5
celery稍微深入说明
https://www.jianshu.com/p/027538ffb8c1
celery 中文文档
https://www.jianshu.com/p/a556cac5bf7d
celery 集群管理的实现
https://www.jianshu.com/p/a7d453abed3c
分布式异步任务队列神器-Celery
https://www.jianshu.com/p/fb3de1d9508c