参考链接: 使用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
下面是成功运行时的图