django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间。可不可以立刻对用户返回响应,然后在后台运行那些操作呢?

crontab定时任务很难达到这样的要求 ,异步任务是很好的解决方法,有一个使用python写的非常好用的异步任务工具Celery。

broker、worker和backend

Celery的架构由三部分组成,消息中间件(broker),任务执行单元(worker)和任务执行结果存储(result backends)组成。

应用程序调用Celery的时候,会向broker传递消息,而后worker将会取到消息,对程序进行执行,backend用于存储这些消息以及Celery执行的结果。

消息中间件broker

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。

RabbitMQ是最好的消息中间件,使用方法如下:

Using RabbitMQ

Redis也是可行的,虽然有信息丢失的风险:

Using 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 -"celery[redis]"

写应用程序

写一个简单的应用tasks.py:

1
2
3
4
5
6
7
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
    return + 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(44)

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.000579041981837s8

存储结果

使用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.result
7
>>> 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(一)介绍相关推荐

  1. django中使用celery简单介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ...

  2. celery mysql 异步_celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis]

    前言: 51cto的文章已经不再补充更新了,另外celery rabbitmq详细的使用方法请到这里浏览. http://xiaorui.cc/2014/11/16/celery-rabbitmq%E ...

  3. 异步任务神器 Celery 快速入门

    简介 在程序运行过程中,要执行一个很久的任务,但是我们又不想主程序被阻塞,常见的方法是多线程.可是当并发量过大时,多线程也会扛不住,必须要用线程池来限制并发个数,而且多线程对共享资源的使用也是很麻烦的 ...

  4. python消息队列celery_python异步任务神器celery

    图片来源:http://blog.51cto.com/huangzp/2052713 最近生产环境的消息量越来越大,服务器采用nginx转发并负载均衡到tornado服务器,服务器有点处理不过来了. ...

  5. 分布式异步任务神器-Celery

    最近研究了下异步任务神器-Celery,发现非常好用,可以说是高可用,假如你发出一个任务执行命令给 Celery,只要 Celery 的执行单元 (worker) 在运行,那么它一定会执行:如果执行单 ...

  6. 『Python学习笔记』Python中的异步Web框架之fastAPI介绍RestAPI

    Python中的异步Web框架之fastAPI介绍&RestAPI 文章目录 一. fastAPI简要介绍 1.1. 安装 1.2. 创建 1.3. get方法 1.4. post方法 1.5 ...

  7. 条形码/二维码之开源利器ZXing图文介绍

    全文目录: 基本介绍 二维码(比如:QRCode)的编码和解码演示 条形码(比如:EAN-13)的编码和解码演示 [一]. 基本介绍 : 1-1. ZXing是一个开源Java类库用于解析多种格式的条 ...

  8. 异步任务神器 Celery 简明笔记

    转自:https://funhacks.net/2016/12/13/celery/ Celery 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用 ...

  9. Celery基本介绍

    文章目录 Celery架构及介绍 Celery的优点 版本支持情况 使用场景 Celery架构及介绍 项目开发中经常碰到需要使用异步任务的场景,比如一个WEB请求中有运行时间很长的业务运算,如果不采用 ...

  10. 强大易用!新一代爬虫利器 Playwright 的介绍

    来源:进击的Coder Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium.Pyppeteer 等,都可以驱动浏览器进行各种自动化操作.它的功能 ...

最新文章

  1. 谷歌员工论坛自述引程序员羡慕,只招募最优秀的人,薪资福利超棒
  2. R语言dplyr包进行dataframe的连接(inner_join、left_join、right_join、full_join、semi_join、anti_join)操作实战
  3. 原创 | 工业场景中的预测性维护
  4. is属性用法 vue_Vue中is属性的用法 可以动态切换组件
  5. node 跨域请求设置
  6. 音视频技术开发周刊(第130期)
  7. Dom对象、JavaScript对象、jQuery对象区别
  8. gpgga格式读取MATLAB,GPS编码格式及读取.doc
  9. 程序为什么非得装入内存再执行?
  10. 接待顾客接待久了,发现大家讨价还价的方式基本三种
  11. URL地址相对路径转绝对路径
  12. 微信小程序傻瓜制作_从15款工具中精选出4款,最靠谱的微信小程序制作软件!...
  13. 九爷带你了解 2017年3-4月企业面试题总结
  14. DWG文件如何转换为PDF黑白文件
  15. bind dns mysql,linux下bind9.8+dlz+mysql 的dns服务器局域网配置
  16. 智能手机选购建议(2018)
  17. 内外部函数和内存模型
  18. MATLAB GUIDE 面板(panel)上的控件消失问题和不靠谱的解决方案
  19. 如何把小米手机便签内容云同步到iPhone XS上?
  20. 安卓手机与Linux同步后,搜索文件内的内容

热门文章

  1. 16.2互联网媒体信息讽刺识别
  2. HTML - 字符实体
  3. php 如何执行top命令,批处理模式下运行 top 命令的方法
  4. 蓝桥杯2016年第七届C/C++省赛A组第一题-网友年龄
  5. 7-2 查找指定字符 (15 分)
  6. L2-027 名人堂与代金券 (25 分)—团体程序设计天梯赛
  7. rk3399 io工具的使用示例
  8. 设置电脑右下角显示自己的大名
  9. [六省联考2017]分手是祝愿
  10. IOS 获取.plist文件的数据