Python中异步的处理celery(任务队列)

什么是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()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值