写作背景介绍

最近在做后台图像处理,需要使用到celery这个异步任务框架。但是使用的时候遇到很多技术问题,为了方便日后再遇到相似问题时能够快速解决。写下这篇文章也希望能够帮助共同奋战在同一战线的程序员们。这篇是入门级的文章,如果你已经使用过celery开发过项目完全可以忽略它。当然也非常欢迎你给我留下你宝贵的意见。下一篇文章将会深入一点,期待能再次看到你。

Celery环境搭建

celery是异步处理框架,我们需要一个消息队列来下发我们的任务。使用RabbitMQ是官方特别推荐的方式,因此我也使用它作为我们的broker

安装rabbitmq

我使用的是linuxmint系统,如果是你使用的是ubuntu或者其他的操作系统可以在官网找到安装方案。

sudo apt-get install rabbitmq-server

安装celery

Celery可以通过pip自动安装,如果你喜欢使用虚拟环境安装可以先使用virtualenv创建一个自己的虚拟环境。反正我喜欢使用virtualenv建立自己的环境。

pip install -U celery

第一个例子

按照编程的惯例,我们先设计一个hello world示例。

第一步

编写简单的纯python函数

def say(x,y):
return x+y if __name__ == '__main__':
say('Hello','World')

第二步

如果这个函数不是简单的输出两个字符串相加,而是需要查询数据库或者进行复杂的处理。这种处理需要耗费大量的时间,还是这种方式执行会是多么糟糕的事情。为了演示这种现象,可以使用sleep函数来模拟高耗时任务。

import time

def say(x,y):
time.sleep(5)
return x+y if __name__ == '__main__':
say('Hello','World')

第三步

这时候我们可能会思考怎么使用多进程或者多线程去实现这种任务。对于多进程与多线程的不足这里不做讨论。现在我们可以想想celery到底能不能解决这种问题。

import time
from celery import Celery app = Celery('sample',broker='amqp://guest@localhost//') @app.task
def say(x,y):
time.sleep(5)
return x+y if __name__ == '__main__':
say('Hello','World')

现在来解释一下新加入的几行代码,首先说明一下加入的新代码完全不需要改变原来的代码。导入celery模块就不用解释了,声明一个celery实例app的参数需要解释一下。

  1. 第一个参数是这个python文件的名字,注意到我们已经把.py去掉了。
  2. 第二个参数是用到了我们的rabbitmq队列啦!可以看到其使用的方式非常简单,因为它是默认的消息队列端口号都不需要指明。

第四步

现在我们已经使用了celery框架了,我们需要让它找几个工人帮我们干活。好现在就让他们干活。

celery -A sample worker --loglevel=info

这条命令有些长,我来解释一下吧。

  1. -A代表的是Application的首字母,我们的应用就是在sample里面呢。
  2. worker 就是我们的工人了,他们会努力完成我们的工作的。
  3. -loglevel=info指明了我们的工作后台执行情况,虽然工人们已经向你保证过一定努力完成任务。但是谨慎的你还是希望看看工作进展情况。

    回车后你可以看到类似下面这样一个输出,如果是没有红色的输出那么你应该是没有遇到什么错误的。

第五步

现在我们的任务已经被加载到了内存中,我们不能再想之前那样执行python sample.py来运行程序了。我们可以通过终端起到python然后通过下面的方式加载任务。

python

输入python语句

from sample import say
say.delay('hello','world')

我们的函数会立即返回,不需要等待。就那么简单celery解决了我们的问题。可以发现我们的say函数不是直接调用了,它被celerytask装饰器修饰过了。所以多了一些属性。目前我们只需要知道使用delay就行了。

第六步

看看我的结果吧!

可怜的我们会发现结果输出在另一个终端上不是我们调用say.delay的终端上。这其实是正常的,因为我们的工作已经交给后台去处理了。

总结

现在,我们知道celery的确可以在后台完成我们交给它的任务。只不过它脾气我们还没摸透。为什么干完事了没有告诉我们,让我们在任务发布终端等了好久。还有就是celery配置在工作函数say一个文件中总是让我们感觉不爽。这些问题我们下一篇文章将会解决它,看看celery到底多强大。

celery简单入门的更多相关文章

  1. celery简单应用

    写作背景介绍 在celery简单入门中已经介绍了写作的背景,这篇文章主要是深入介绍celery的使用技巧.在实际的项目中我们需要明确前后台的分界线,因此我们的celery编写的时候就应该是分成前后台两 ...

  2. 异步任务神器 Celery-入门

    一.Celery入门介绍 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务.比如,在 Web 开发中,对新用户的注册,我们通常会给他 ...

  3. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  4. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  5. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  8. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  9. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

随机推荐

  1. Reflector 已经out了,试试ILSpy[转]

    Reflector是.NET开发中必备的反编译工具.即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善.举例说明,它有一个可以查看程序集完整名称的功 ...

  2. 理解GC日志

    每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...

  3. Nginx-->进阶-->原理-->Nginx+php+fastcgi的原理与关系

    一.用户对动态PHP网页访问过程 用户浏览器发起对网页的访问:http://192.168.1.103/index.php 用户和nginx服务器进行三次握手进行TCP连接(忽略包括nginx访问控制 ...

  4. JSP中setattribute与setParameter的区别

    HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下区别: (1)HttpServletRequest类有setAttri ...

  5. Phone Gap [error] cmd: Command failed with exit code 1

    下投票 我不知道如何解决这个问题,但尝试了这一点,将解决肯定. 这是由于ANT工具找不到的tools.jar在JRE lib目录下.当我从复制的tools.jar JDK的lib目录下,以JRE li ...

  6. Median of Two Sorted Arrays

    题目:https://leetcode.com/problems/median-of-two-sorted-arrays/ 算法分析 这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个 ...

  7. 一些有意思的APP

    1.简书:一个优雅的写作/阅读平台. 2.知乎:知识分享社区: 3.behance:设计者的圈子: 4.海词词典:电脑.手机同步查询的好帮手(电脑端快捷键:双击 Alt 弹出/关闭查询框,非常方便) ...

  8. lsslot

    lsslot 命令 用途 显示动态可重新配置的插槽(比如热插拔)及其特性. 语法 lsslot -c ConnectorType [ -a | -o | -l DeviceName | -s Slot ...

  9. VB6.0 读取Excel文件并返还数据集RecordSet

    读取Excel文件并返还数据集RecordSet 该方法适用于.xls,.xlsx类型的文件 读取Excel文件的Function: '取得数据集 Function getRecordSetForEx ...

  10. Points on cycle

    Description There is a cycle with its center on the origin. Now give you a point on the cycle, you a ...