目录
1、Celery
Celery是一个基于分布式消息传输的异步任务队列,支持即插即用,使用异步处理问题(如文件上传、图像、音频处理等比较耗时的任务,注意与apscheduler定时框架的区别)。
Celery通过消息进行通信(与中间件的机制类似,如东方通公司的TongLink/Q),主要由三块组成:client(客户端)、Broker(中间人)以及worker(任务处理者)组成。
常用的中间人有Redis、RabbitMQ,我这里用的是Redis。
2、Celery的常用用法
Celery应用主要包括编写装饰器、编写配置文件、命令行启动、任务调用这四步。
2.1 编写装饰器
考虑到降低耦合性,我这里将主程序入口与装饰器分开来写,首先编写一下主程序入口:
from celery import Celery
app=Celery('Redis',include=['Redis.tasks'])
app.config_from_object('Redis.celery_config')
if __name__=='__main__':
app.start()
备注:上面Redis指的是项目目录名称,include指的是包含了在Redis目录下的tasks.py这个文件;app.config_from_object用来加载配置文件,配置文件为celery_config.py。
来看一下任务函数tasks.py:
import time
from Redis.app_main import app
@app.task # 添加app.task装饰器
def add(x,y):
time.sleep(1)
return x+y
tasks.py只有一个任务函数add,让它生效的最直接的方法就是添加app.task这个装饰器。add的功能是先休眠一秒,然后返回两个数的和。
2.2 编写配置文件
celery_config.py :
BROKER_URL='redis://:redis密码@ip地址/0' # 消息代理
CELERY_RESULT_BACKEND='redis://:redis密码@ip地址:6379/1' #将结果存在redis
CELERY_TASK_SERIALIZER='msgpack' #任务序列化和反序列化,使用msgpack方案
CELERY_RESULT_SERIALIZER='json' # 读取任务对性能要求不高,使用json
CELERY_TASK_RESULT_EXPIRES=60*60*24 # 过期时间24h
CELERY_ACCEPT_CONTENT=['json','msgpack'] # 指定接受的内容类型
备注:msgpack是一个二进制的类json的序列化方案,但是比json的数据结构更小、更快(是不是想到了MongoDB的数据结构呢,它是bson,也是类似于json结构)。
2.3 命令行启动
回到项目根目录下,执行命令:
celery -A Redis.app_main worker -l info
备注: -A指的是对应的应用程序,后面跟Celery实例的位置;worker指的是启动一个worker ; -l info 相当于 --loglevel=info,打印日志且日志级别为info。
调用结果示例:
2.4 任务调用
运行test.py:
from Redis.tasks import add
r1=add.delay(1,2)
r2=add.delay(2,4)
r3=add.delay(3,6)
运行日志如下,后面得到每一条任务的运行结果(3、6、9),并且每一条任务的id都有记录: