文章目录
python常用库之Celery
一、什么是Celery
Celery 官网:http://www.celeryproject.org/
gihub:https://github.com/celery
Celery 官网中文版:http://docs.jinkan.org/docs/celery/
celery
美: [ˈsɛləri]
英: ['selərɪ]
n. 芹菜;(调味用) 香芹粉
网络 西芹;旱芹;西洋芹
Celery 是使用 python 编写的分布式任务调度框架。
Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。celery非常易于集成到一些web开发框架中。
- 可以不依赖任何服务器,通过自身命令,启动服务
- celery服务为其他项目服务提供异步解决任务需求
二、使用场景
有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求。
- 异步执行:解决耗时任务,将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
- 延迟执行:解决延迟任务,比如5秒后发送短信等
- 定时执行:解决周期(周期)任务,比如每天数据统计
三、Celery特点
- 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的。
- 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务。
- 快速:一个单进程的celery每分钟可处理上百万个任务。
- 灵活: 几乎celery的各个组件都可以被扩展及自定制。
四、Celery几个主要的概念
-
celery 应用
用户编写的代码脚本,用来定义要执行的任务,然后通过 broker 将任务发送到消息队列中。 -
broker
提交任务到broker,也就是任务中间件上!
消息代理,又称消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理。
Celery本身并不提供消息服务,使用第三方服务,也就是borker来传递任务,一般使用rabbitMQ或者Redis。
broker官方只支持下面:
-
backend
数据库,用来存储任务返回的结果。 -
worker
工人,用来执行 broker 分派的任务。Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中
使用 celery 首先需要选择一个消息队列。可以是redis。
提交任务到broker,也就是任务中间件上。
五、celery 安装
pip install -U Celery
六、celery 使用
python 异步任务框架 Celery 入门,速看
参考URL: https://zhuanlan.zhihu.com/p/444879714
思路:需要编写一个 celery 应用,它用来创建任务和管理 wokers。在tasks.py
文件中定义任务函数。
celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等,在使用celery的时候,app必须能够被其他的模块导入。
创建一个tasks.py
文件(这个文件是你自己项目中定义 Celery 任务的地方):
from celery import Celery
# Celery 应用初始化
celery_app = Celery('proj', , include=['proj.tasks'], broker='redis://localhost:6379/0')
# celery_app = Celery('tasks', broker='postgresql://username:password@localhost:5432/dbname', backend='db+postgresql://username:password@localhost:5432/dbname')
@app.task
def add(x, y):
return x + y
- 第一个参数是应用名称
- broker 是消息代理(如 redis url)的 broker URL
- backend 是结果存储 backend 的 URL (如 redis url)
- include 是要包含的任务模块
接着是任务函数文件tasks.py
import time
from proj.app_test import celery_app
@celery_app.task
def add(x, y):
time.sleep(1)
return x + y
tasks.py只有一个任务函数add,让它生效的最直接的方法就是添加app.task这个装饰器。add的功能是先休眠一秒,然后返回两个数的和。
最终调用:
from proj.tasks import add
import time
t1 = time.time()
r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)
r4 = add.delay(4, 8)
r5 = add.delay(5, 10)
r_list = [r1, r2, r3, r4, r5]
for r in r_list:
while not r.ready():
pass
print(r.result)
t2 = time.time()
print('共耗时:%s' % str(t2-t1))
在这个程序中,我们调用了add函数五次,delay()用来调用任务。
我们一次性调用了五次add函数,但是运行的总时间才1秒多。这是celery异步运行的结果,如果是同步运行,那么,至少需要5秒多,因为每调用add函数一次,就会休眠一秒。这就是celery的强大之处。
celery_app.conf.update(
task_serializer='json',
accept_content=['json'