python常用库之分布式任务调度框架Celery

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'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值