写作背景介绍
最近在做后台图像处理,需要使用到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
的参数需要解释一下。
- 第一个参数是这个
python
文件的名字,注意到我们已经把.py
去掉了。 - 第二个参数是用到了我们的rabbitmq队列啦!可以看到其使用的方式非常简单,因为它是默认的消息队列端口号都不需要指明。
第四步
现在我们已经使用了celery框架了,我们需要让它找几个工人帮我们干活。好现在就让他们干活。
celery -A sample worker --loglevel=info
这条命令有些长,我来解释一下吧。
-
-A
代表的是Application的首字母,我们的应用就是在sample里面呢。 -
worker
就是我们的工人了,他们会努力完成我们的工作的。 -
-loglevel=info
指明了我们的工作后台执行情况,虽然工人们已经向你保证过一定努力完成任务。但是谨慎的你还是希望看看工作进展情况。
回车后你可以看到类似下面这样一个输出,如果是没有红色的输出那么你应该是没有遇到什么错误的。
第五步
现在我们的任务已经被加载到了内存中,我们不能再想之前那样执行python sample.py
来运行程序了。我们可以通过终端起到python
然后通过下面的方式加载任务。
python
输入python
语句
from sample import say
say.delay('hello','world')
我们的函数会立即返回,不需要等待。就那么简单celery
解决了我们的问题。可以发现我们的say
函数不是直接调用了,它被celery
的task
装饰器修饰过了。所以多了一些属性。目前我们只需要知道使用delay
就行了。
第六步
看看我的结果吧!
可怜的我们会发现结果输出在另一个终端上不是我们调用say.delay
的终端上。这其实是正常的,因为我们的工作已经交给后台去处理了。
总结
现在,我们知道celery的确可以在后台完成我们交给它的任务。只不过它脾气我们还没摸透。为什么干完事了没有告诉我们,让我们在任务发布终端等了好久。还有就是celery
配置在工作函数say
一个文件中总是让我们感觉不爽。这些问题我们下一篇文章将会解决它,看看celery
到底多强大。