flask+celery处理异步任务

celery是一个强大的分布式任务队列,在这里我们介绍一下它最基本的处理异步任务的功能,包含以下几个:

  • 创建Celery实例

  • 创建一个异步任务

  • 查询异步任务的信息

  • 取消异步任务

使用的环境是flask3.0+Celery5.4

1. 创建Celery实例

celery通过中间件获取任务,再将任务结果写入backend,所以创建实例时需要传递这两个的url,其支持多种协议(比如redis、rabbitmq等),这里我们以redis为例。最简单的一种是创建对象时传递:

from celery import Celery

celery_app = Celery(__name__, broker='redis://localhost:6379/0', backend='redis://localhost:6379/1')

另外一种是使用配置文件,按官方文档的例子,在同级目录创建一个celeryconfig.py文件,写入配置信息,然后更新celery对象的配置:

celery_app = Celery(__name__)
apcelery_appp.config_from_object('celeryconfig')

但可能是由于Celery版本问题,配置字段改变了(大小写改变),这种方法连接backend一直报错,暂时还没找到原因

2. 创建一个异步任务

类似于flask,celery也使用装饰器来创建任务处理函数,比如官方例子:

@celery_app.task
def add(x, y):
    ret
<think>我们参考了用户提供的引用内容,特别是引用[1]和[2]中关于CeleryFlask中实现异步任务和定时任务的描述。用户的需求是使用FlaskCelery实现定时任务,并希望得到教程指导。 根据引用内容,我们知道Celery是一个分布式异步任务队列,支持定时任务(由Celery Beat处理)。在Flask中集成Celery,通常需要配置消息代理(如Redis)和结果存储(可选)。引用[1]提到了使用Redis作为消息代理,以及通过Flask-Mail发送延时邮件的例子。 因此,我们将分步骤讲解如何在Flask中配置Celery并实现定时任务: 1. 安装必要的库:celery, redis, Flask-Mail(如果涉及邮件发送) 2. 创建Flask应用并配置Celery 3. 定义Celery任务 4. 配置定时任务(使用beat) 5. 启动Celery worker和beat 注意:定时任务需要Celery Beat进程来周期性发送任务。 下面是具体步骤:</think>### Flask-Celery实现定时任务教程 下面将分步骤讲解如何在Flask应用中集成Celery实现定时任务: #### 1. 安装依赖 ```bash pip install celery redis Flask flask-mail ``` #### 2. 项目结构 ``` your_project/ ├── app.py ├── celery_config.py ├── tasks.py └── requirements.txt ``` #### 3. 配置文件 (`celery_config.py`) ```python # 消息代理和结果后端配置 broker_url = 'redis://localhost:6379/0' result_backend = 'redis://localhost:6379/0' # 时区设置 timezone = 'Asia/Shanghai' # 导入任务模块 imports = ('tasks', ) # 定时任务配置 beat_schedule = { 'every-10-seconds': { 'task': 'tasks.periodic_example', 'schedule': 10.0, # 每10秒执行 'args': () }, 'daily-report': { 'task': 'tasks.send_daily_report', 'schedule': crontab(hour=9, minute=0), # 每天9点执行 } } ``` #### 4. 任务模块 (`tasks.py`) ```python from celery import Celery from flask_mail import Message from app import mail, create_app # 创建Celery实例 celery = Celery(__name__) celery.config_from_object('celery_config') @celery.task def periodic_example(): print("周期性任务执行中...") return "OK" @celery.task def send_daily_report(): # 需要在应用上下文中执行 with create_app().app_context(): msg = Message("每日报告", sender="admin@example.com", recipients=["user@example.com"]) msg.body = "这是自动发送的每日报告" mail.send(msg) return "邮件已发送" ``` #### 5. Flask应用 (`app.py`) ```python from flask import Flask from flask_mail import Mail from celery import Celery app = Flask(__name__) app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = 'your-email@example.com' app.config['MAIL_PASSWORD'] = 'your-password' mail = Mail(app) # 初始化Celery def make_celery(app): celery = Celery( app.import_name, backend=app.config['CELERY_RESULT_BACKEND'], broker=app.config['CELERY_BROKER_URL'] ) celery.conf.update(app.config) return celery app.config.update( CELERY_BROKER_URL='redis://localhost:6379/0', CELERY_RESULT_BACKEND='redis://localhost:6379/0' ) celery = make_celery(app) @app.route('/') def index(): return "Flask-Celery定时任务示例" if __name__ == '__main__': app.run() ``` #### 6. 启动服务 1. 启动Redis服务: ```bash redis-server ``` 2. 启动Celery worker: ```bash celery -A tasks worker --loglevel=info ``` 3. 启动Celery beat(定时任务调度器): ```bash celery -A tasks beat --loglevel=info ``` 4. 启动Flask应用: ```bash python app.py ``` #### 7. 验证定时任务 - 在Celery worker终端查看周期性日志输出 - 检查邮箱是否收到定时发送的邮件 - 可通过Flower监控任务执行: ```bash pip install flower celery -A tasks flower ``` 访问 http://localhost:5555 ### 关键概念说明 1. **消息代理**:使用Redis作为任务队列的中间件[^3] 2. **Celery Beat**:定时任务调度器,负责触发周期性任务[^4] 3. **任务装饰器**:`@app.task`将普通函数转换为Celery任务[^3] 4. **应用上下文**:定时任务中访问Flask资源需要手动创建应用上下文[^1] ### 常见问题解决 1. **时区不一致**:在配置中明确设置`timezone = 'Asia/Shanghai'` 2. **任务未执行**:检查beat和worker是否同时运行 3. **邮件发送失败**:确认SMTP配置正确,邮箱开启授权码登录 通过以上步骤,你可以在Flask应用中实现可靠的定时任务系统。定时任务特别适用于报表生成、数据清理、通知发送等场景[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值