[转载] Flask+Celery+Redis简单操作

参考链接: 使用Flask,Redis和Celery的异步任务

使用celery可以使得任务异步执行,在处理复杂或耗时长的任务时经常需要,废话不多说,直接进入正题。 

结构树  安装各种包 

pip install celery

pip install radis

 

_init_.py文件中添加celery实例的创建函数 

def make_celery(app=None):

    app = app or create_app('default')

    # 异步队列

    celery = Celery(app.name, broker=CELERY_BROKER_URL, backend=CELERY_RESULT_BACKEND)

    celery.conf.update(app.config)

    TaskBase = celery.Task

 

    class ContextTask(TaskBase):

        abstract = True

 

        def __call__(self, *args, **kwargs):

            with app.app_context():

                return TaskBase.__call__(self, *args, **kwargs)

 

    celery.Task = ContextTask

    return celery

 

同时导入app.config的文件中(或者直接设置)添加broker和backend,在这里我用的都是redis 

    CELERY_BROKER_URL = 'redis://localhost:6379/0'

    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

 

同级目录创建一个tasks.py脚本 

from random import randrange

from time import sleep

 

from . import make_celery

from .models import pic_data

from .ext import db

 

celery = make_celery()

 

 

@celery.task(name='task1')

def data_deal():

    # 下面是要执行的异步操作

    t = randrange(0, 2)

    pic = pic_data()

    pic.name = 'wyman{}'.format(t)

    db.session.add(pic)

    db.session.commit()

 

 

视图中调用 

@blue.route('/', methods=['POST', 'GET'])

def index():

    if request.method == 'GET':

        pic_list = pic_data.query.all()

        return render_template('base.html', pic_list=pic_list)

    from App.tasks import data_deal

    # 调用celery的task任务

    data_deal.delay()

    return redirect(url_for('blue.index'))

 

然后首先开启flask项目,再开启celery,-A后面跟的是项目中celery实例的位置 

python manage.py runserver -r

celery -A App.tasks worker --loglevel=info

 

然后和预期一样失败了,原因大概可能是因为windows不太兼容,但可以装一个包并在启动celery时指定来解决 

pip install eventlet

celery -A App.tasks worker --loglevel=info -P eventlet

 

下面是成功运行时的图

你可能感兴趣的:([转载] Flask+Celery+Redis简单操作)