Celery分布式任务队列的认识和基本操作

Stella981
• 阅读 1041

一、简单认识

  Celery是由Python开发、简单、灵活、可靠的分布式任务队列,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。

它的特点有:

  • 简单:熟悉了它的流程后,配置使用简单;
  • 高可用:任务执行失败或执行过程中发生连接中断,Celery会自动重新执行任务;
  • 快速:一个单进程的Celery每分钟可处理上百万个任务;
  • 灵活:Celery的各个组件都可以被扩展及自定制;

应用场景举例:

1.web应用:用户在网站进行某个操作需要很长时间完成时,我们可以将这种操作交给Celery执行,直接返回给用户,等到Celery执行完成以后通知用户,大大提好网站并发及用户体验感。

2.任务场景:需要批量在几百台机器执行某些命令或者任务,Celery可以轻松搞定。

3.定时任务:向定时导数据报表、定时发送通知类似场景,Celery可以提供管理接口和丰富的API。

二、架构和工作原理

Celery由以下三部分构成:消息中间件(Broker)、任务执行单元(Worker)、结果存储(Backend):来个图

Celery分布式任务队列的认识和基本操作

消息中间件(Broker):

  消息中间件Broker支持RabbitMQ、Redis、MongoDB、Memcached 等,官方推荐RabbitMQ。

任务执行单元(Worker)

  Worker是任务执行单元,负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。

结果存储(Backend)

  Backend结果存储官方也提供了诸多的存储方式支持:RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch。

工作原理

任务模块Task包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往消息队列,而定时任务由Celery Beat进程周期性地将任务发往消息队列;

任务执行单元Worker实时监视消息队列获取队列中的任务执行;

Woker执行完任务后将结果保存在Backend中;

三、安装使用

Redis的安装:

  参考我的另外一篇:https://www.cnblogs.com/Utopia-Clint/p/10868258.html

Celery的安装:

一个简单的应用(Linux环境下)

注意:此时并没有将配置文件、任务文件及初始化文件分开,真的到应用环境中是要分开的,后面会提到;

创建一个文件目录:

mkdir /root/celery_study

Celery分布式任务队列的认识和基本操作

在celery_study创建文件task.py

 Celery分布式任务队列的认识和基本操作

task.py:任务定义文件

# -*- coding:utf-8 -*-
# @Author  : Clint
from celery import Celery
app = Celery('task',
             broker='redis://:123456@localhost:6379',
             backend='redis://:123456@localhost:6379',
             )


@app.task
def add(x, y):
    print("running...", x, y)
    return x + y

 启动Worker

celery -A task worker  --loglevel=info

各个参数含义:

  worker: 代表第启动的角色是work当然还有beat等其他角色;

  -A :项目路径,这里我的目录是task;

  -loglevel:启动的日志级别,有info、debug等,更多参数使用celery --help查看

Celery分布式任务队列的认识和基本操作

任务队列已经准备就绪;

我们还需要通过delay或apply_async来将任务添加到worker中,这里我们通过交互式方法添加任务,并返回AsyncResult对象,通过AsyncResult对象获取结果:

Celery分布式任务队列的认识和基本操作

AsyncResult除了get方法用于常用获取结果方法外还提以下常用方法或属性:

  • state: 返回任务状态;
  • task_id: 返回任务id;
  • result: 返回任务结果,同get()方法;
  • ready(): 判断任务是否以及有结果,有结果为True,否则False;
  • info(): 获取任务信息,默认为结果;
  • wait(t): 等待t秒后获取结果,若任务执行完毕,则不等待直接获取结果,若任务在执行中,则wait期间一直阻塞,直到超时报错;
  • successfu(): 判断任务是否成功,成功为True,否则为False;
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
手把手教你在Windows下设置分布式队列Celery的心跳轮询
/1前言/大家好,我是吴老板。用Celery官方的话来说,Celery是一个非常优秀的分布式队列,可应用于分布式共享中间队列和定时任务等等。/2 版本的差异/    Celery有很多个版本,各版本之间的差异可谓不小,比如最新的Celery6.0版本在稳定性远不如Celery4.0,所以在使用不同版本的时候,系统给到我们的反馈可能并不
Stella981 Stella981
3年前
Python 并行分布式框架之 Celery
Celery(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.celeryproject.org%2F) (芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。架构设计!(http://s
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Python celery简介
Celery异步分布式什么是celery?他是一个python开发的异步分布式任务调度模块celery本身不提供消息服务,使用第三方服务,也就是broker来传递任务,目前支持rabbitmq,redis,数据库等等。我们使用redis连接URL的格式为:redis://:password@hostname:port/
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Celery简单说明以及在Django中的配置
Celery1.什么是CleleryCelery是一个简单、灵活且可靠的,处理大量消息的分布式系统专注于实时处理的异步任务队列同时也支持任务调度Celery架构Celery的架构由三部分组成,消息中间件(messagebroker),任务执行单元(worker)和任务执行结果存储(taskresu
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了