序言
在上一篇博客中记录了Celery的安装及初步简单使用,如果需要请前往查看,本文在上一篇的环境基础上继续记录Celery的配置使用及配置分离。前一篇博客的例子是将Celery的实例配置和任务都写在了tasks.py的python文件中,这在多模块任务或者大型项目(需要自定义很多的Celery配置)中就不太方便,我们把配置和任务及测试都分离出来,这样我们要修改其中某一个配置就可以直接去配置文件中找。接下来我们将Celery的配置独立于一个文件,任务也独立于一个文件。
再啰嗦一下安装的环境版本:
- system:Ubuntu 16.04
- python:Python 3.5.2
- celery:4.2.0
- redis:2.10.6
文件目录
新建一个command文件夹(我的目录为/home/youjun/celery/command ),其中的目录结构如下:
celery/
|-- command/
|-- |-- __init__.py
|-- |-- application.py
|-- |-- config.py
|-- |-- tasks.py
|-- |-- test.py
注意:官网中说明了在你先写好的celery程序包下必须包含一个celery.py的文件,由于我们运行(ctr+alt+t打开终端,进入celery程序包所在目录,例如我的是:cd /home/youjun/celery ,然后执行启动命令celery -A command worker --loglevel=info ,command即为我们写好的celery程序包)的时候,celery会去寻找command下的celery.py模块开始运行,如果没有这个模块,那么就会报错了。我们这里没有celery.py文件,那么也有对应的解决办法(后面说明)。
模块
__init__模块
在__init__.py文件中写入如下内容:
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-8-23 上午10:00
# @Author : YYJ
# @File : __init__.py.py
# @CopyRight: ZDWL
# ----------------------------------------------
import command.application as celery
__all__ = ('celery', 'config', 'tasks')
前面说了在command下必须有一个celery.py模块,我们这里没有,用的是application.py文件,然后我们可以通过第一行代码把application取一个别名叫celery,这样celery程序就能找到command下的celery模块了(实际是application,当然你可以修改名字为任意的了),如果不理解建议去看看Python的__init__.py文件和__all__的作用。
application模块
- 内容
在application.py文件中写入如下内容:
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-8-23 上午10:05
# @Author : YYJ
# @File : app.py
# @CopyRight: ZDWL
# ----------------------------------------------
from __future__ import absolute_import
from celery import Celery
# 创建Celery实例,我们称之为Celery应用程序或简称app。这个实例是Celery中执行的所有操作的入口点,例如创建任务和管理工作程序
# 因此其他模块必须可以导入它。
app = Celery()
# 配置配置文件
app.config_from_object('command.config')
这一块就两点,一就是创建一个celery实例,二就是配置celery实例的配置文件,我们创建celery实例的时候不传任何参数,我们只需要把所有的配置放在command下的config.py模块中,然后通过app.config_from_object('command.config') 告诉celery配置文件去使用command下的config.py模块。
config模块
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-8-23 上午10:01
# @Author : YYJ
# @File : config.py
# @CopyRight: ZDWL
# ----------------------------------------------
# 配置代理
broker_url = 'redis://127.0.0.1:6379/0'
# 配置结果后端
result_backend = 'redis://127.0.0.1:6379/0'
enable_utc = False
# 配置时区
timezone = 'Asia/Shanghai'
# 配置需要导入的任务模块
imports = ('command.tasks', )
在这里你可以配置你的配置参数,其中重要的是代理和任务的导入,我们使用redis(broker_url和result_backend参数)做结果后端,imports里是我们需要导入的模块,我们需要把我们的任务导入,所以必须在这里对任务tasks模块写入imports配置,注意这里全部都是小写参数名,当然我们可以给参数加前缀(在下一篇博客中介绍)。
tasks模块
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-8-23 上午10:02
# @Author : YYJ
# @File : tasks.py
# @CopyRight: ZDWL
# ----------------------------------------------
from __future__ import absolute_import
from command.application import app
# 这里定义了一个加法的任务,并使用@app.task来注册任务
@app.task
def add(x, y):
z = x + y
print(z)
return z
这一块就是你要执行的任务代码了,这里简单定义了一个加法的任务(在具体的项目中,你可以改成你自己的任务,比如你可以在这里写一个统计数据库中订单今日的销售总额的任务函数),内容不多,先从command.application导入我们创建的celery实例app,然后通过装饰器@app.task将add函数注册为一个celery任务。
现在是只有一个task模块,当我们任务比较多的时候也可以分离多个task模块,实质就是在config中的imports中添加你要导入的任务,注意你的任务在系统环境中能找到,不然会报No module … 的异常,具体的多任务模块在后面的博客再详细点介绍。
test模块
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-10-19 下午2:50
# @Author : YYJ
# @File : test.py
# @CopyRight: ZDWL
# ----------------------------------------------
import sys
# 将路径加入系统环境中
sys.path.append('/home/youjun/celery')
# 动态导入
tasks = __import__('command.tasks', fromlist=['add', ])
tasks.add.delay(4, 5)
这里有比较重要的东西,注意我的test.py是可以放在任意的地方运行的,原因在于我使用sys.path.append('/home/youjun/celery') 将我写的celery程序包command所在的路径加到了系统环境中,这样我们相当于把我们的command包临时安装到系统里(这里我说明一下,我们平时pip3安装的一些包都在/usr/local/lib/python3.5/dist-packages 下,比如我们安装了celery对吧,那么在这个目录下就能找到celery目录,那么我们在导入的时候做了如此一个导入:from celery.apps.beat import Beat 那么是怎么导入的呢,Python会从系统环境中所有的路径中去找哪个目录下有celery/apps/beat.py(beat.py里还有Beat对象) 目录的,于是找到了完整目录是/usr/local/lib/python3.5/dist-packages/celery/apps/beat.py 如果找遍所有的环境都没有找到,那么就会报一个错误了,我们这里使用sys.path.append('/home/youjun/celery') 就是在这个程序运行期间把这个路径也加入环境中也就是Python在这之后运行的时候也会在这个路径下去找你的包或者模块,那么我们就可以使用Python动态导入我们的任务模块了,这里必须把这个路径加入环境中,因为我们动态导入的模块中有from command.application import app ,不导入的话是找不到command包的)。
剩下的就是动态导入__import__的使用了,这里不做解释,不是本篇博客内容。最后一行代码是调用任务。这个测试文件可以放在任何地方执行,前提是把你编写的celery程序包的路径如上加入环境中,我的为/home/youjun/celery ,需要改为你自己的目录,所以你的项目假设需要自己调用的话就可以派上用场。
运行测试
进入你的celery程序包(我的为command)所在目录(我的为),执行celery -A command worker --loglevel=info (command就是要运行的celery包名,改为你自己的),执行结果如下:

进入你的test.py所在目录(我的为/home/youjun/celery/command/ ),执行python3 test.py ,结果如下:

最后执行了调用后的结果如下,可以看到打印的结果为9:

结语
到此celery的初配置及任务独立,初步配置就结束了,讲解的不少有些可能还不详细,如有问题欢迎交流指正,原创文章不易,如有帮助到你请点个赞。在下一篇将会介绍celery配置和使用contab定时任务,以及结合django的ORM操作数据库。
上一篇:Django定时器Celery+Redis(一)Celery安装使用
下一篇:Django定时器Celery+Redis(三)Celery配置详解及结合Django定时操作数据库(努力编写中。。。)
|