celery实测之定时任务

博客介绍了在Python中使用celery的相关操作,具体是新建一个tasks文件并给出代码,还提及启动定时任务,聚焦于Python和celery在定时任务方面的应用。

新建一个tasks文件,里面代码如下:

# coding:utf-8
import requests
from celery import Celery    

Ip='http://127.0.0.1:8000'

app = Celery('tasks', broker='redis://127.0.0.1:6379/0')   # 实例化对象

@app.on_after_configure.connect       
def setup_periodic_tasks(sender, **kwargs):
    # 每5秒钟就调用一次test方法
    sender.add_periodic_task(5, test.s('{}/case_manage/v1/man_pro/getlifetime/'.format(Ip)), name='add every 10seconds')



@app.task
def test(url):
    requests.get(url)

 

启动定时任务:

# 进入项目case_manage 目录下  执行以下命令:

celery 定时器启动命令:
case_manage>celery -A tasks beat

celery 开启命令:
celery -A tasks worker --loglevel=info --pool=solo

 

<think>我们参考了用户提供的引用内容,特别是引用[1]和[2]中关于Celery在Flask中实现异步任务和定时任务的描述。用户的需求是使用Flask和Celery实现定时任务,并希望得到教程指导。 根据引用内容,我们知道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]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值