异步任务利器Celery(一)介绍
django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间。可不可以立刻对用户返回响应,然后在后台运行那些操作呢?
crontab定时任务很难达到这样的要求 ,异步任务是很好的解决方法,有一个使用python写的非常好用的异步任务工具Celery。
broker、worker和backend
Celery的架构由三部分组成,消息中间件(broker),任务执行单元(worker)和任务执行结果存储(result backends)组成。
应用程序调用Celery的时候,会向broker传递消息,而后worker将会取到消息,对程序进行执行,backend用于存储这些消息以及Celery执行的结果。
消息中间件broker
Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。
RabbitMQ是最好的消息中间件,使用方法如下:
Redis也是可行的,虽然有信息丢失的风险:
其余broker Broker Overview。
任务执行单元worker
Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
任务结果存储backend
用来存储Worker执行的任务的结果:SQLAlchemy/Django ORM, Memcached, Redis, RPC (RabbitMQ/AMQP)。
下载
下载Celery很简单:
|
1
|
$ pip install celery |
这里使用Redis作为broker实践一下,需要额外的库支持,可以一起下载:
|
1
|
$ pip install -U "celery[redis]" |
写应用程序
写一个简单的应用tasks.py:
|
1
2
3
4
5
6
7
|
from celery import Celeryapp = Celery('tasks', broker='redis://localhost:6379/0')@app.taskdef add(x, y): return x + y |
运行worker
在命令行中运行:
|
1
|
$ celery -A tasks worker --loglevel=info |
输出如下:
|
1
2
3
4
|
[2017-09-10 06:59:58,665: INFO/MainProcess] Connected to redis://localhost:6379/0[2017-09-10 06:59:58,671: INFO/MainProcess] mingle: searching for neighbors[2017-09-10 06:59:59,688: INFO/MainProcess] mingle: all alone[2017-09-10 06:59:59,724: INFO/MainProcess] celery@ubuntu ready. |
发送任务
进入python环境:
|
1
2
|
>>> from tasks import add>>> add.delay(4, 4) |
worker里就可以看到任务处理的消息:
|
1
2
|
[2017-09-10 07:02:34,874: INFO/MainProcess] Received task: task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb] [2017-09-10 07:02:34,876: INFO/ForkPoolWorker-1] Task task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb] succeeded in 0.000579041981837s: 8 |
存储结果
使用Redis作为存储backend,在tasks.py中修改:
|
1
|
app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0') |
运行后就可以查看结果了:
|
1
2
3
4
5
6
7
8
|
>>> from task import add>>> r=add.delay(3,4)>>> r.result7>>> r.ready()True>>> r.get(timeout=1)7 |
可以查看Redis中的存储:
|
1
2
3
|
127.0.0.1:6379> get celery-task-meta-f2032d3e-f9a0-425d-bce4-f55ce58c8706"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": 7, \"task_id\": \"f2032d3e-f9a0-425d-bce4-f55ce58c8706\", \"children\": []}"127.0.0.1:6379> |
超级简单,想要对Celery做更进一步的了解,请参考官方文档。
异步任务利器Celery(一)介绍的更多相关文章
- 异步任务利器Celery(二)在django项目中使用Celery
Celery 4.0支持django1.8及以上的版本,低于1.8的项目使用Celery 3.1. 一个django项目的组织如下: - proj/ - manage.py - proj/ - __i ...
- 异步任务神器 Celery-入门
一.Celery入门介绍 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务.比如,在 Web 开发中,对新用户的注册,我们通常会给他 ...
- 高并发异步解耦利器:RocketMQ究竟强在哪里?
上篇文章消息队列那么多,为什么建议深入了解下RabbitMQ?我们讲到了消息队列的发展史: 并且详细介绍了RabbitMQ,其功能也是挺强大的,那么,为啥又要搞一个RocketMQ出来呢?是重复造轮子 ...
- Django 异步化库celery和定时任务
首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决. 首先我们要安装celery库 p ...
- 异步分布式队列Celery
异步分布式队列Celery 转载地址 Celery 是什么? 官网 Celery 是一个由 Python 编写的简单.灵活.可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具 ...
- 异步任务神器 Celery 简明笔记
转自:http://www.jianshu.com/p/1840035cb510 异步任务 异步任务是web开发中一个很常见的方法.对于一些耗时耗资源的操作,往往从主应用中隔离,通过异步的方式执行.简 ...
- Django(41)详解异步任务框架Celery
celery介绍 Celery是由Python开发.简单.灵活.可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务.Celery ...
- 条形码/二维码之开源利器ZXing图文介绍(转)
继前面介绍的一个日本开源软件(该软件只能实现QRCode)原文: Java实现二维码QRCode的编码和解码(http://sjsky.iteye.com/blog/1136934 ),今发现又一优秀 ...
- node js 异步运行流程控制模块Async介绍
1.Async介绍 sync是一个流程控制工具包.提供了直接而强大的异步功能.基于Javascript为Node.js设计,同一时候也能够直接在浏览器中使用. Async提供了大约20个函数,包含经常 ...
随机推荐
- 修改nopCommerce中的实体
对已有实体增加一个属性(对Category增加一个SomeNewProperty) 最近在研究nopcommerce,这里是对官网上文档的学习 ...
- PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别
HTTP定义了与服务器交互的不同的方法,最基本的是POST.GET.PUT.DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post.get.pu ...
- asp.net -mvc框架复习(3)-控制器和动作方法的任务分析
using System;using System.Collections.Generic;using System.Linq;using System.Web;//ASP.NET核心命名空间usin ...
- extends和implements的区别
extends表示继承 implements表示抽象类的接口
- JavaScript URL传值过程中遇到的问题及知识点总结
JavaScript URL传值过程中遇到的问题及知识点总结 Web系统开发过程中经常用到URL进行传值,刚刚接触时不太会解析,会出现中文乱码问题等. 1.父子页面之间的传值(在一个页面中以加载ifr ...
- Linux - ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
启动ubuntu,以root用户登陆,打开命令行终端 输入命令:#vim /root/.profile 找到.profile文件中的mesg n 将其替换成tty -s && mesg ...
- C# winform页面可视化设计打开失败,提示未能加载程序集或他的一个依赖项,dll错误
这种情况发生在最初项目是x86属性,改成x64后,一些原来dll,页面没有及时更新,导致页面找不到dll, 最简单的解决方式,把项目属性改成AnyCpu,重新编译下,就可以打开可视化设计窗口了.
- shopnc验证码显示不了
data/config文件编码问题,要utf-8无bom
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- su鉴定故障
su切换用户鉴定故障 [yolo1@izqfsfqp8ejn9zz ~]$ su root密码:su: 鉴定故障[yolo1@izqfsfqp8ejn9zz ~]$ sudo root 我们信任您已经 ...