Celery分布式任务队列框架--基于flask实现

  1. 使用Celery的方法
    Celery是分布式的任务队列

    特点: 简单、灵活、高可用

    1) 安装Celery

    pip install celery

    2) 安装 redis
    redis可以使用list结构,提供消息队列的功能

    3)创建Celery对象并指定broker代理路径
    broker 格式: redis://[:password@]host:port/db

    app = Celery('tasks',
                broker='redis://127.0.0.1:6379/10’)
    app = Celery('tasks',
             backend='redis://:[email protected]:6379/7’,    # 返回值存入数据库
             broker='redis://:[email protected]:6379/8')      #   :密码@host/post/db

    @app.task
    def sendMsg(recievers,html):
        #注意 在celery的子任务中必须要尝试获取
        with manage.app.test_request_context( ):
            msg = Message(subject='tpp用户激活-v1.0',
                      recipients=[recievers],
                      sender='[email protected]')
            #需要使用html,如果使用text可能会报错
            msg.html = html
            ext.mail.send(msg)
            print('邮件发送成功’)
    if __name__ == '__main__':
        print('--批量下订单--')
        for i in range(20):
            #向celery发送任务,并获取异步结果对象
            result:AsyncResult = goOrder.delay('XB99900888'+str(i))
            #实时获取结果(任务执行结果)
            #result.get(timeout=1,interval=0.5,callback=orderCallback)
            print(result.get_leaf( ))
        print('--下订单已完成--')

4)创建功能函数(完成的时间不确定),并将函数交给Celery后台线程

    @app.task
    def goOrder(orderId):
        # 下订单的功能
        time.sleep(20)
        print('--下订单成功--')

5) 运行经过@app.task装饰的函数
格式: 函数名.delay(函数的参数)
goOrder.delay(100011) # 向celery发送运行函数的信号

6) 在window 会出现 ValueError: not enough values to unpack…
原因: Window系统 默认不支持Python的线程间的事件处理
解决: pip install eventlet
启动: celery -A tasks worker –loglevel=info -P eventlet
例:

import time

from celery import Celery
from celery.bin import celery
from celery.result import AsyncResult
from flask_mail import Message

import manage
import ext

app = Celery('tasks',
             backend='redis://:[email protected]:6379/7',
             broker='redis://:[email protected]:6379/8')  #   :密码@host/post/db

@app.task   #交给Celery队列去调用
def goOrder(order_id):
    print('--goOrder--')
    time.sleep(5)
    print('完成{}的订单'.format(order_id))

    return '{} 确认完成'.format(order_id)

def orderCallback(id,value):

    print(id,'----订单完成----',value)

@app.task
def sendMsg(recievers,html):
    #注意 在celery的子任务中必须要尝试获取
    with manage.app.test_request_context():
        msg = Message(subject='用户激活-v1.0',
                      recipients=[recievers],
                      sender='[email protected]')
        #需要使用html,如果
        msg.html = html
        ext.mail.send(msg)
        print('邮件发送成功')

if __name__ == '__main__':
    print('--批量下订单--')
    for i in range(20):
        #向celery发送任务,并获取异步结果对象
        result:AsyncResult = goOrder.delay('XB99900888'+str(i))
        #实时获取结果(任务执行结果)
        #result.get(timeout=1,interval=0.5,callback=orderCallback)
        print(result.get_leaf())
    print('--下订单已完成--')

if __name__ == '__main1__':
    celery.worker_main()

你可能感兴趣的:(python)