celery结构讲解,异步任务的调度工具
任务队列:跨线程,跨机器工作的一种机制 使用的是多进程
客户端(Django flask 发布任务的一方)
发布任务 send_sms.delay() 会将任务存到任务队列,先进先出
任务发送 (具体传递的是什么)发送的仅仅是函数的(任务的)名字
任务队列(broker)RabbitMQ Message Queue消息队列 Redis
任务处理者(worker)多任务处理:进程(默认,进程池),协程(greenlet, gevent),
获取任务处理,拿到的也仅仅是任务的名字,因此,在worker里面要实现任务的详细代码
在客户端,可以不用写实现任务的详细代码
启动:
celery -A(表示要启动的应用实例) celery代码的启动文件 worker -l(表示任务日志等级) info
celery -A ihome.tasks.main worker -l info
生产者消费者模型
发布任务者需要知道任务执行情况,任务执行者保存结果数据的第四方backend(Redis数据库或者其他数据库)
客户端在想要获取结果的时候,从backend中自己读取结果数据
先要安装 pip install celery
在项目文件夹下新建task包,在下面新建main.py作为启动文件
# coding:utf-8
from celery import Celery
# 创建celery对象,管理整个celery的工具
app = Celery('ihome')# ihome:给当前创建出的异步任务celery取名,可以随便取
在tasks包下新建config.py作为配置文件
# coding:utf-8
BROKER_URL = "redis://127.0.0.1:6379/5"
# 注意如果这里Redis使用了用户名和密码需要加上 redis://用户名:密码@127.0.0.1:6379/5
CELERY_RESULT_BACKEND = “redis://127.0.0.1:6379/6"
再在main.py中
app = Celery("ihome")
# app.config_from_object(config) 需要 from ihome.tasks import config
也可以
app.config_from_object("ihome.tasks.config")
tasks下新建sms包是任务包,与任务所有有关的文件都可以放到这个目录下
在包下面新建tasks.py (注意这个名字是固定的),写任务的代码
from ihome.tasks.main import app
from ihome.libs.yuntongxun.sms import CCP
# 定义任务
@app.task
def send_template_sms(to, datas, temp_id):
"""发送短信"""
ccp = CCP()
ret = ccp.send_template_sms(to, datas, temp_id)
return ret
再在main.py中,# 让celery自己找到任务
app.autodiscover_tasks(['ihome.tasks.sms'])
在程序中调用:
from ihome.tasks.sms import tasks
调用为: ret = tasks.send_template_sms.delay()
print(ret.id) 可以拿着去backend中去找
result.get() 通过get方法能不用自己去backend中拿取执行结果,get方法会帮助我们返回执行结果
get()默认阻塞,会等到worker执行完成有了结果的时候才会返回
get()通过timeout超时时间,可以在超时时间超过后立即返回