使用Django框架编程时, 由于框架的封装限制,在没有编写底层代码的情况下,要把一段代码放到一个新的进程里去运行,我们就会使用异步执行任务的包Celery。
虚拟环境安装celery
pip install celery
一般把耗时的函数放在任务之中去执行,以发送短信为例:
概念:
任务task:一个耗时的函数,开发人员封装的函数,定义了耗时的代码
队列queue:存储任务的地方,如redis,保存要执行的函数的名称
代理人broker:接收通知,将任务加入队列→调用者,任务函数.delay()
工人worker:从队列中读取任务,执行。对应一个新的进程
使用celery发短信例子步骤:
创建一个celery_task包用来编写异步模块,再在该此包下创建一个config.py文件和一个main.py文件,文件目录结构如下
1.配置config,main文件
config.py配置如下
broker_url='redis://127.0.0.1:6379/15'
main.py配置如下
from celery import Celery
# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'sms.setting' # 项目的setting配置路径,根据自己项目的实际配置路径更改
# 创建celery应用
app = Celery('sms')
# 导入celery配置
app.config_from_object('celery_tasks.config')
# 自动注册celery任务,即自己编写的tasks.py里的函数
app.autodiscover_tasks([
])
2.自定义任务
创建sms包(为解耦之后的其他耗时模块,都用独立的包来编写各自的逻辑)
创建tasks.py 注意:固定只能取名tasks
定义函数
添加装饰器@app.task
from celery_tasks.main import app
@app.task
def send_sms(mobile):
pass
回过头来,在main.py注册列表里添加自己所写的函数,用于自动识别任务
···
app.autodiscover_tasks([
'send_sms'
])
3.调用
函数.delay(参数)
send_sms.delay(mobile)
4.启动工人
celery -A celery_tasks.main worker -l info