Celery进阶

目录

 

1、Celery

2、Celery的常用用法

2.1 编写装饰器

2.2 编写配置文件

2.3 命令行启动

2.4 任务调用


1、Celery

Celery是一个基于分布式消息传输的异步任务队列,支持即插即用,使用异步处理问题(如文件上传、图像、音频处理等比较耗时的任务,注意与apscheduler定时框架的区别)。

Celery通过消息进行通信(与中间件的机制类似,如东方通公司的TongLink/Q),主要由三块组成:client(客户端)、Broker(中间人)以及worker(任务处理者)组成。

常用的中间人有Redis、RabbitMQ,我这里用的是Redis。

扫描二维码关注公众号,回复: 13131865 查看本文章

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都有记录:

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/111343209