celery基本使用

celery结构讲解,异步任务的调度工具

任务队列:跨线程,跨机器工作的一种机制 使用的是多进程

客户端(Django flask 发布任务的一方)

发布任务 send_sms.delay() 会将任务存到任务队列,先进先出

任务发送  (具体传递的是什么)发送的仅仅是函数的(任务的)名字

任务队列(brokerRabbitMQ Message Queue消息队列 Redis

任务处理者(worker多任务处理:进程(默认,进程池),协程(greenlet, gevent), 

获取任务处理,拿到的也仅仅是任务的名字,因此,在worker里面要实现任务的详细代码

在客户端,可以不用写实现任务的详细代码

启动:

celery -A(表示要启动的应用实例) celery代码的启动文件 worker -l(表示任务日志等级) info

celery -A ihome.tasks.main worker -l info

生产者消费者模型


发布任务者需要知道任务执行情况,任务执行者保存结果数据的第四方backendRedis数据库或者其他数据库)

客户端在想要获取结果的时候,从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超时时间,可以在超时时间超过后立即返回


































猜你喜欢

转载自blog.csdn.net/ernest_li_shun/article/details/80398159