Django定时器Celery+Redis(一)Celery安装使用

前言

       开发Django也有一段时间了,在最近的项目遇到了需要使用定时器的需求:在每天的00:00需要对每个用户的当天消费数据进行统计。这时候就需要用到定时任务,加上使用的Django开发,所以选择了Celery。
       Celery是一个基于python开发的分布式任务队列框架,可以使用任务队列的方式在分布式的机器上执行任务调度。译名为:芹菜,不知道和分布式任务队列MQ有何关联。其主要包含:

  • Broker:发送和接收MQ队列任务消息的方案,常用是RabbitMQ和Redis,还有Amazon SQS、Zookeeper
  • Workers:处理任务的苦力,每个worker就相当于一个进程,可以有很多个worker
  • Beat:任务安排,制定任务,定时管理,可以理解为管理worker工作的
  • Backend:存储处理结果的后端

环境

       本小节先记录Celery的初步使用,其中我的环境为:

  • system:Ubuntu 16.04
  • python:Python 3.5.2
  • celery:4.2.0
  • redis:2.10.6

安装

       由于我是基于Python3开发,所以安装都使用pip3,我将Redis作为Broker服务,虽然Celery官方更建议使用RabbitMQ,但我这里选用Redis,这里没有安装Celery与Redis的连接包celery-with-redis,完全可行,暂时就不安装使用了。

sudo pip3 install celery==4.2.0
sudo pip3 install redis==2.10.6
sudo apt-get install redis-server

       安装完以上环境后,默认安装完redis-server后便已开启了Redis的服务,不过你还是可以用命令来启动。

sudo redis-server

       启动成功后你会看到下面部分内容,意思是Redis服务已经在6379端口上准备好了,等待连接开工!
 Django定时器Celery+Redis(一)Celery安装使用_第1张图片  
 这里写图片描述

简单使用

       首先建立一个celery测试文件夹,然后在这个文件夹中建立一个tasks.py文件和test.py文件,目录结构如下:

celery/
|-- __init__.py
|-- tasks.py
|-- test.py

       然后在tasks.py文件中添加如下代码:

from celery import Celery

# 创建Celery实例,我们称之为Celery应用程序或简称app。这个实例是Celery中执行的所有操作的入口点,例如创建任务和管理工作程序
# 因此其他模块必须可以导入它。第一个参数是Celery当前模块的名称。第二个参数是broker关键字参数,指定要使用的消息代理的URL。
# 这里改为使用redis,默认使用的是RabbitMQ。
app = Celery('tasks', broker='redis://localhost:6379/0')


# 这里定义了一个加法的任务,并使用@app.task来注册任务
@app.task
def add(x, y):
    return x + y

       在test.py中添加如下代码:

# 引入注册的任务
from tasks import add

# 要调度celery任务,需要使用该delay()方法。这是调度任务的便捷快捷方式,apply_async()可以更好地控制任务执行:
add.delay(4, 5)

       在celery目录下(注意目录不能错,进入到新建的celery文件夹内)打开终端,执行如下命令启动worker:

sudo celery -A tasks worker -l info

       不出意外会得到如下运行结果:

Django定时器Celery+Redis(一)Celery安装使用_第2张图片

       再开一个终端,同样进入celery目录,执行如下:

sudo python3 test.py

       回去看刚才的终端会出现,其中显示了任务tasks.add执行的结果:

Django定时器Celery+Redis(一)Celery安装使用_第3张图片

结语

       至此,本篇博文基本结束了,简单回顾一下过程,首先安装好环境后启动redis-server,然后建立celery文件夹编写celery应用程序和任务tasks.py,再编写执行任务调度的test.py文件,启动celery的worker(celery的苦力,一个进程,等待别人发起执行任务的命令),然后调度任务,执行test.py,让worker工作,worker工作后得到结果4+5=9,这就是这个简单使用的整个过程。

注意

       1. 在执行sudo celery -A tasks worker -l info的时候加上了sudo,原因是由于安装celery的时候也加了sudo,所以celery是安装在root用户下,你当前的用户就没有celery,执行celery -A tasks worker -l info可能会报bash: /usr/local/bin/celery: 没有那个文件或目录的错误。
       2. sudo celery -A tasks worker -l info的tasks指的是运行的module文件的名字,不是创建celery实例的名称(执行这个就会把tasks.py文件当做module注入临时的系统环境里,这样后面我们就可以导入这个模块了from tasks import *,所以下面的第三条导入add函数的时候不会出错)。也就是说把实例改为app = Celery('command', broker='redis://localhost:6379/0')也是可以的。
       3. 在test.py文件中如果你在IDE中打开celery目录下的文件发现from tasks import add会报错,不用管,执行不会出错,在运行celery实例的时候tasks这个module已经注册到临时系统环境里,我们现在可以在任意进程里随时使用这个module下的任何函数。

下一篇: Django定时器Celery+Redis(二)Celery配置和任务模块化

你可能感兴趣的:(Django)