flask-celery

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

### FlaskCelery集成概述 Flask 是一种轻量级的 Python Web 框架,而 Celery 则是一种分布式任务队列工具,用于处理异步任务。两者可以很好地协同工作来实现后台任务调度和执行功能。 #### 配置环境并安装依赖项 为了使 FlaskCelery 能够一起运行,首先需要确保已正确安装所需的库。可以通过 pip 安装这些包: ```bash pip install flask celery redis ``` 这里 Redis 作为消息代理被选用,当然也可以选择其他支持的消息中间件[^1]。 #### 创建基础应用结构 定义一个简单的 Flask 应用程序以及初始化 Celery 实例的方法如下所示: ```python from flask import Flask from celery import Celery def make_celery(app_name=__name__): broker_url = 'redis://localhost:6379/0' backend_url = 'redis://localhost:6379/0' celery_app = Celery( app_name, broker=broker_url, backend=backend_url ) class ContextTask(celery_app.Task): def __call__(self, *args, **kwargs): with app.app_context(): return self.run(*args, **kwargs) celery_app.Task = ContextTask return celery_app app = Flask(__name__) celery = make_celery() ``` 上述代码片段展示了如何创建带有上下文感知的任务类 `ContextTask` 来保证在任务执行期间能够访问到 Flask 的应用程序上下文[^2]。 #### 添加示例任务 下面是一个发送电子邮件的简单例子,该操作通常耗时较长适合放入后台完成: ```python @celery.task def send_async_email(email_data): """Background task to send an email with Flask-Mail.""" from your_flask_project.extensions import mail msg = Message(email_data['subject'], sender=app.config['MAIL_DEFAULT_SENDER'], recipients=[email_data['to']]) msg.body = email_data['body'] with app.app_context(): mail.send(msg) ``` 此函数通过调用 Celery 提供装饰器标记为可延迟执行的任务,并且利用了 Flask 上下文中配置好的邮件服务组件实例化对象来进行实际通信[^3]。 #### 启动 Celery Worker 进程 最后一步是在单独终端窗口启动 worker 工作线程监听来自生产者端提交过来的新作业请求: ```bash celery -A path.to.your.celery_instance worker --loglevel=info ``` 其中 `-A` 参数指定加载哪个模块下的 Celery 对象;`worker` 命令表示开启工作者模式;`--loglevel` 设置日志记录级别以便调试使用[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值