Celery 使用(一)

Celery 使用(一)

架构

  1. Producer:任务发布者;
  2. Celery Beat:任务调度器,Beat进程会读取配置文件中的内容,周期性的将配置中到期需要执行的任务发送给任务队列;
  3. Broker:消息代理,接受生产者的任务消息,存进队列后发送给消费者;
  4. Celery Worker:执行任务的消费者;
  5. Result Backend:保存消费者执行任务完后的结果;

如下图:

整体的流程,任务发布者或者是任务调度,将任务发送到消息代理中,接着消息代理将任务发送给消费者来执行,其执行完后将结果保存到backend中。

使用

先创建Celery实例和相关的任务,这里配置Celery可以通过创建一个配置文件,然后通过app.config_from_object(‘proj.celeryconfig‘)加载即可。

task.py如下

from celery import Celery
app = Celery(‘tasks‘, backend=‘amqp‘, broker=‘amqp://[email protected]:5672//‘)
@app.task
def add(x, y):
    return x + y

接下来,创建相关的任务发布者,run_task.py如下

from task2 import add
result = add.delay(1,1)
import time
while not result.ready():
    print(‘not yet ready‘)
    time.sleep(1)
print(result.get())

然后在项目目录中,通过命令执行Celery,命令如下:

celery -A task2.app worker --loglevel=info

如果看到命令行里显示该实例的所有任务说明执行成功,最后再开一个进程执行任务,接着就会看到命令行中的提示信息,说明消费者执行成功,并且将结果保存到backend中。

一个简单的用例就结束了。

疑惑

之前有一个疑惑的点在于,既然RabbitMQ可以实现任务队列,要Celery有何用呢?

从我搜索到的知识来看,有以下几点:

  1. Celery可以支持多种消息代理,不仅仅是RabbitMQ,还有Redis、MongoDB等等;
  2. RabbitMQ是消息队列,其可以应用到各种场景中,包括任务分发系统,也就是需要自己实现一个Celery,而Celery本身就是一个任务分发系统,显然简化了代码,不需要重复造轮子;
时间: 2024-09-28 22:03:38

Celery 使用(一)的相关文章

分布式队列 Celery

详情参见: 分布式队列神器 Celery 个人学习总结后续更新……

异步任务利器Celery(一)介绍

django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间.可不可以立刻对用户返回响应,然后在后台运行那些操作呢? crontab定时任务很难达到这样的要求 ,异步任务是很好的解决方法,有一个使用python写的非常好用的异步任务工具Celery. broker.worker和backend Celery的架构由三部分组成,消息中间件(broker),任务执行单元(worker)和任务执行结果存储(result backends)组成. 应用程序调用

django celery的分布式异步之路(一) hello world

设想你遇到如下场景: 1)高并发 2)请求的执行相当消耗机器资源,流量峰值的时候可能超出单机界限 3)请求返回慢,客户长时间等在页面等待任务返回 4)存在耗时的定时任务 这时你就需要一个分布式异步的框架了. celery会是一个不错的选择.本文将一步一步的介绍如何使用celery和django进行集成,并进行分布式异步编程. 1.安装依赖 默认你已经有了python和pip.我使用的版本是: python 2.7.10 pip 9.0.1virtualenv 15.1.0 创建沙盒环境,我们生产

结合Django+celery二次开发定时周期任务

需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的SQL.收件人.执行时间等等参数就可以几分钟写完一个定时任务脚本 ,到后面不知道是不是吃药了一天三四个定时任务,不到半个月手里一下就20多个定时任务了,渐渐感到力不从心了,而且天天还要给他们修改定时任务的SQL.收件人.执 行时间等等,天天写定时任务脚本

celery出现警告或异常的解决方式

做个笔记,记录下使用celery踩过的坑,不定期更新.  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED)) 我用的是Flask,所以在Flask的配置文件 confg.py 中,设置好CELERY_ACCEPT_CONTENT这个属性即可.  WARNING/MainProcess 一样对配置文件做下修改 增加属性 CELERY_REDIRECT_STDOUTS_LEVEL = 'INFO' p.p1 { margin: 0.0px

celery queue

1.vi tasks.py #coding:utf-8 from server import app import random,string,smtplib @app.task def add(x,y):     return x+y @app.task def send_mail():         SUBJECT="临时登录密码"         HOST="smtp.163.com"         # TO=passwords['config']['em

Celery/RabbitMQ在Ubuntu上的安装

1.安装RabbitMQ sudo apt-get install rabbitmq-server sudo rabbitmqctl add_user [username] [password] sudo rabbitmqctl add_vhost [vhostname] sudo rabbitmqctl set_user_tags [username] [tagname] sudo rabbitmqctl set_permissions -p [vhostname] [username]".*

Celery的实践指南

celery原理: celery实际上是实现了一个典型的生产者-消费者模型的消息处理/任务调度统,消费者(worker)和生产者(client)都可以有任意个,他们通过消息系统(broker)来通信. 典型的场景为: 客户端启动一个进程(生产者),当用户的某些操作耗时较长或者比较频繁时,考虑接入本消息系统,发送一个task任务给broker. 后台启动一个worker进程(消费者),当发现broker中保存有某个任务到了该执行的时间,他就会拿过来,根据task类型和参数执行. 实践中的典型场景:

redis celery too many connection

用django 框架,异步任务用celery,队列用redis 出现了这个问题,too many connection Couldn't ack '5f41afc62d-a112-bef34d5de1cc', reason:ConnectionError('Too many connections',) Traceback (most recent call last): File "/srv/www/wom/env/lib/python2.6/site-packages/kombu/messa

在tornado中使用celery实现异步任务处理之一

一.简介 tornado-celery是用于Tornado web框架的非阻塞 celery客户端. 通过tornado-celery可以将耗时任务加入到任务队列中处理, 在celery中创建任务,tornado中就可以像调用AsyncHttpClient一样调用这些任务. ? Celery中两个基本的概念:Broker.Backend Broker : 其实就是一开始说的 消息队列 ,用来发送和接受消息. Broker有几个方案可供选择:RabbitMQ,Redis,数据库等 Backend: