flask 异步任务celery入坑问题
flask版本:1.1.2
celery版本:5.0.5
1.flask使用celery:
首先安装必要模块
pip install celery
pip install redis
在 Flask 中初始化 Celery:
from flask import Flask
from celery import Celery
app = Flask(__name__)
# 配置
# 配置消息代理的路径,如果是在远程服务器上,则配置远程服务器中redis的URL
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
# 要存储 Celery 任务的状态或运行结果时就必须要配置
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
# 初始化Celery
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
# 将Flask中的配置直接传递给Celery
celery.conf.update(app.config)
上述代码中,通过 Celery 类初始化 celery 对象,传入的应用名称与消息代理的连接 URL。
2.通过 celery.task 装饰器装饰耗时任务对应的函数
@celery.task(name='edr_ids/app')
def test_fun():
print('异步任务..........')
注意:name必须填写,否则会出现如下错误:
name是项目名称加模块名称,例如:
3.Flask 中定义接口通过异步的方式执行耗时任务
@app.route('/ids/generate_pcap', methods=['GET'])
def generate_pcap():
task = test_fun.delay()
print(task1.id)#任务id
return jsonify({"msg": "开启成功", "code": 200})
delay () 方法是 applyasync () 方法的快捷方式,applyasync () 参数更多,可以更加细致的控制耗时任务,比如想要 long_task () 在一分钟后再执行
def generate_pcap():
task = test_fun.apply_async(countdown=5)
print(task1.id)#任务id
return jsonify({"msg": "开启成功", "code": 200})
delay () 与 apply_async () 会返回一个任务对象,该对象可以获取任务的状态与各种相关信息。
4.启用work
celery -A app.celery worker -l info
此时,调用flask /ids/generate_pcap接口即可看到定时任务已经运行成功:
有关获取任务进度及更详细的信息参见:flask-celery