python celery异步_Python - Celery异步任务

Celery概述

关于celery的定义,首先来看官方网站:

简单来看,是一个基于python开发的分布式异步消息任务队列,持使用任务队列的方式在分布的机器、进程、线程上执行任务调度。通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。

你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福 。

Celery 在执行任务时需要通过一个中间人(消息中间件)来接收和发送任务消息,以及存储任务结果,完整的中间人列表请查阅官方网站

PS:任务队列是一种在线程或机器间分发任务的机制。

PS:消息队列的输入是工作的一个单元,称为任务,独立的工作(Worker)进程持续监视队列中是否有需要处理的新任务。

Celery简介

Celery 系统可包含多个职程和中间人,以此获得高可用性和横向扩展能力,其基本架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

消息中间件,Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成,一般使用rabbitMQ or Redis,当然其他的还有MySQL以及Mongodb。

任务执行单元,Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储,Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括Redis,MongoDB,Django ORM,AMQP等。

Celery的主要特点:

简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的

高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务

快速:一个单进程的celery每分钟可处理上百万个任务

灵活: 几乎celery的各个组件都可以被扩展及自定制

Celery基本工作流程图

根据前面的介绍,我们可以得出如下流程图:

1、用户应用程序讲任务通过celery放入Broker中。

2、多个worker通过Broker获取任务并执行。

3、worker执行完成后,会把任务的结果、状态等信息返回到Broker中存储,供用户程序读取。

PS:Celery 用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程。

Celery模块的基本使用

要使用Celery需要先安装celery模块,下面的例子使用Python3进行举例。

PS:如果你是编译安装的Python3,执行以上步骤后不一定代表正确安装,还需要在命令行下执行celery命令,如果报错请参考这篇文章:Python3安装Celery模块后执行Celery命令报错。

Celery初探

下面的例子使用redis作为消息中间人的角色。

创建一个celery application

用来定义任务列表,这里任务文件的名称叫做task.py(注意后面会用到文件名)。

 其他中间人配置方法

运行一个worker

当然这里可以执行多个worker,在命令行下执行

 Celery worker启动后info日志信息

发布(调用)任务

这里在task.py所在的目录调用Python解释器执行,这样可以方便的引入这个app。

PS:调用任务会返回一个 AsyncResult 实例,可用于检查任务的状态,等待任务完成或获取返回值(如果任务失败,则为异常和回溯)。 但这个功能默认是不开启的,需要设置一个 Celery 的结果后端(配置了backend才会生效)。

PS:通过检查redis的数据也可以查看结果信息

 redis结果信息

AsyncResult 实例常用方法

通过获取异步执行对象的返回值来获取AsyncResult实例对象

ready() 方法查看任务是否完成处理

get() 等待任务完成,但这很少使用,因为它把异步调用变成了同步调用

 利用propagate美化get异常输出

PS:如果celery没有配置backend,那么执行get方法将会异

traceback获取原始的回溯信息

task_id  获取任务的任务id

在项目中使用Celery

在项目中,把配置信息和程序代码写在一起,是一件很low的事请,所以在项目中我们一般会使用配置文件的方式,来对之前的基本使用方式进行拆分

celery应用

即单独把celery任务做成一个单独的应用。

我的celery应用名称为appcelery,目录结构如下:

PS:celery的配置文件命名必须为celery,否则提示无法导入,不知道为啥,这里就先按照celery来命名。

配置及worker代码如下:

后台启动多进程celery work

前面的启动方法一次只能启动一个,会在前台显示并打印日志,终端退出,那么celery进程也会退出,当然我们可以使用&来进行后台启动,日志可以使用-q来禁止输出,但是这毕竟不是最佳方法,官方提供了多进程后台的启动方式利用 celery  multi 启动

其他常用参数

celery其他的常用于管理worker的参数有很多,可以使用celery -h来查看。

 celery命令帮助文档

其他参数举例:

测试

这里还是用python解释器进行测试

在redis中查看key的过期时间

Celery的定时任务

celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat,类似于Linux中的crontab。主要有两种类型:每隔多久执行一次或者定期执行。

由于是定期执行,所以celery的定时任务主要有两类进程,即完成任务的worker进程和分发任务的beat进程。

定时任务程序

启动一个beat进程:celery -A celeryperiodic beat

 启动beat进程

启动一个worker进程: celery -A celeryperiodic worker

日志结果

其他

执行完毕后会在当前目录下产生一个二进制文件,celerybeat-schedule 。

该文件用于存放上次执行结果:

1、如果存在celerybeat-schedule文件,那么读取后根据上一次执行的时间,继续执行。

2、如果不存在celerybeat-schedule文件,那么会立即执行一次。

3、如果存在celerybeat-schedule文件,读取后,发现间隔时间已过,那么会立即执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值