安装使用celery异步任务
1. 关于celery
Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。
celery用典型的生产者-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。实际应用中,用户从Web前端发起一个请求,我们只需要将请求所要处理的任务丢入任务队列broker中,由空闲的worker去处理任务即可,处理的结果会暂存在后台数据库backend中。我们可以在一台机器或多台机器上同时起多个worker进程来实现分布式地并行处理任务。
2. 安装celery
sudo pip install celery
sudo pip install djcelery
vagrant@precise64
sudo
pip freeze | grep celery
celery==3.1.25
django-celery==3.2.1
今天(2018-04-23)通过以上两条命令在env中再次安装,发现安装到env之外的环境去了;
还是先下载了celery和djcelery的两个安装包,通过指定python的方法安装了;
如下:
(env27)wfq@ubuntu:~/soft/celery/celery-3.1.25$ pwd
/home/wfq/soft/celery/celery-3.1.25
(env27)wfq@ubuntu:~/soft/celery/celery-3.1.25$ sudo ~/python27/bin/python setup.py install
(env27)wfq@ubuntu:~/soft/celery/django-celery-3.2.2$ pwd
/home/wfq/soft/celery/django-celery-3.2.2
(env27)wfq@ubuntu:~/soft/celery/django-celery-3.2.2$ sudo ~/python27/bin/python setup.py install
(env27)wfq@ubuntu:~/soft/celery/django-celery-3.2.2$ pip freeze | grep celery
celery==3.1.25
django-celery==3.2.2
3. 安装redis作为消息队列
下载地址:http://redis.io/download,下载最新文档版本。
下载完后解压,进入加压后的目录执行make命令
vagrant@precise64:~/redis$ ls
redis-4.0.0 redis-4.0.0.tar.gz
vagrant@precise64:~/redis$ cd redis-4.0.0/
vagrant@precise64:~/redis/redis-4.0.0$ make
make完后 redis-4.0.0目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:
启动redis服务.
vagrant@precise64:~/redis/redis-4.0.0/src$ pwd
/home/vagrant/redis/redis-4.0.0/src
vagrant@precise64:~/redis/redis-4.0.0/src$ ./redis-server &
vagrant@precise64:~/redis/redis-4.0.0/src$ ps -ef | grep redis
vagrant 6614 6433 0 03:02 pts/3 00:00:00 ./redis-server *:6379
vagrant 6619 6433 0 03:02 pts/3 00:00:00 grep --color=auto redis
关闭redis服务
./redis-cli -p 6379 shutdown
查看安装版本
vagrant@precise64:~/redis/redis-4.0.0/src$ ./redis-server -v
Redis server v=4.0.0 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=d230e17d85eb69a9
vagrant@precise64:~/redis/redis-4.0.0/src$
vagrant@precise64:~/redis/redis-4.0.0/src$
vagrant@precise64:~/redis/redis-4.0.0/src$ ./redis-server --version
Redis server v=4.0.0 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=d230e17d85eb69a9
4. 配置settings.py
首先,在Django工程的settings.py文件中加入如下配置代码:
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
其中,当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。BROKER_URL和CELERY_RESULT_BACKEND分别指代Broker的代理地址以及Backend(result store)数据存储地址。在Django中如果没有设置backend,会使用其默认的后台数据库用来存储数据。注意,此处backend的设置是通过关键字CELERY_RESULT_BACKEND来配置
然后,在INSTALLED_APPS中加入djcelery:
INSTALLED_APPS = (
'djcelery',
)
5. 在使用该任务队列的app根目录下,建立tasks.py
# -*- coding: utf-8 -*-
import time
from celery import Celery
from celery import task
@task
def test_add(x, y):
time.sleep(10)
print '===================' + str(x + y)
return x + y
在tasks.py中我们就可以编码实现我们需要执行的任务逻辑,在开始处import task,然后在要执行的任务方法开头用上装饰器@task。需要注意的是,与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名。
6. 生产任务
在需要执行该任务的View中,通过test_add.delay的方式来创建任务,并送入消息队列。比如:
def test(request):
from ops.tasks import test_add
test_add.delay(1, 2)
...
7. 启动worker的命令
python manage.py celery worker -c 4 --loglevel=info
8. 执行任务
查看worker打印出来的日志就可以看到test_add异步任务的执行结果了
9. flower工具
Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现
Django下实现的方式如下:
1. 安装flower:
sudo pip install flower
2.启动flower(默认会启动一个webserver,端口为5555):
python manage.py celery flower
3.进入http://192.168.56.2:5555即可查看