什么是celery
- 帮助开发者解决调用第三方或者校验过程中的网络延迟问题,或者等待造成的客户端不好的体验
- celery是python里面提供的包,这个包叫做异步任务队列,可以用它实现异步任务
- 避免因延时等问题影响主线程任务的等待
celery有什么
- 任务的发出者: 就是我们的第三方需要异步执行的函数,或者方法
- 任务队列:存放需要执行的任务信息
- 处理者:负责监听任务队列,发出任务,就是执行对应的任务函数
celery的特点
- 任务发出者和处理者可以分布在不同的电脑上,通过中间人进行信息的交换
- 任务队列中的任务会进行排序,先添加的任务会被先执行
怎么使用celery
- 创建celery对象并配置中间人地址
# 引入
from celery import Celery
# 创建celery对象,
# 参数一: 随意起的名称 例如这里的demo
celery_app = Celery('demo')
- 配置
配置文件: broker_url = '中间人的地址'
celery_app.config_from_object('配置文件路径')
- 定义任务函数
# 我们这里需要使用上面定义好的对象, 装饰任务
# 这里有个参数: name='当前任务的名称' 这里当前任务的名称可以随便起
@celery_app.task(name='my_task')
def my_task(a, b):
print('任务函数被执行')
...
- 启动celery,任务进行监听
celery -A 'celery_app文件路径' worker -l info
– celery :只要我们装完这个包,就是这个命令
– -A:指定了后面的celery_app文件的路径
– worker: 代表启动了工作
– -l: 一旦工作起来就会启动日志,使用这个参数指定日志的级别
– info: 日志级别
-发出任务
# 注意: 任务一定要调用 delay() 函数
my_task.delay(2, ,3)
使用实例
-
创建一个celery的文件
– 创建一个main.py文件
– 创建一个config.py文件 -
main.py
# 导入
from celery import Celery
# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'myseit.settings.dev'
# 创建celery对象
# 名字随便起的: celery_task
celery_app = Celery('celery_task')
- config.py
# 设置中间人broker地址:
# 我们把信息保存在redis服务器的第三个存储空间中:
broker_url = 'redis://127.0.0.1:6379/3'
# 将刚刚添加的配置信息, 加载配置到这里:
celery_app.config_from_object('celery.config') # 注意这个文件的路径
- 任务函数
第三方包中添加一个tasks.py文件(必须,不要问为什么)
# 导入上面创建的 celery_app 对象
from celery.main import celery_app
# 封装任务函数:
@celery_app.task(name='send_sms_code')
def send_sms_code(a, b):
print('任务函数被调用... a : %s, b : %s' % (a,b))
# 自动发现任务:
# 在自动发现任务的时候, sms里面的任务名字必须是: tasks
# 这是固定死的
celery_app.autodiscover_tasks(['celery.sms'])
- 启动任务函数-创建一个执行者
我们可以在安装有 redis 和 celery 的虚拟环境下, 敲如下命令:
celery -A celery_ts.main worker -l info
- 怎么调用
调用封装好的函数, 注意这里调用的时候,需要加上 delay()
sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires)
小结
- 关于@celery_app.task(name=‘send_sms_code’)这个装饰器,是为了让这个函数能够被调用,在任务发出时,监听这可以调用这个函数
- 而在我们发出这个任务的时候,必须要使用delay()