Skip to content
Closed

kimi-v1 #5855

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions examples/scheduler_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
"""
Flask Scheduler 使用示例
"""
from datetime import timedelta, datetime
from flask import Flask, jsonify
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 创建Flask应用
app = Flask(__name__)

# 配置调度器
app.config.update({
'SCHEDULER_ENABLED': True, # 启用调度器
'SCHEDULER_AUTOSTART': True, # 自动启动调度器
'SCHEDULER_TICK_INTERVAL': 1.0, # 检查间隔(秒)
'SCHEDULER_MAX_WORKERS': 4, # 最大工作线程数
'SCHEDULER_STORAGE_PATH': 'scheduler_data.json' # 存储路径
})

# 初始化调度器
from flask.scheduler import Scheduler
scheduler = Scheduler(app)


# 定义任务
from flask.scheduler.decorators import interval_task, delay_task, cron_task

@interval_task(interval=timedelta(seconds=10), description="每10秒执行一次的示例任务")
def my_interval_task():
"""每10秒执行一次的示例任务"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
logger.info(f"[间隔任务] 执行时间: {current_time}")
return f"间隔任务执行成功: {current_time}"


@delay_task(delay=timedelta(seconds=5), description="延迟5秒后执行的示例任务")
def my_delay_task():
"""延迟5秒后执行的示例任务"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
logger.info(f"[延迟任务] 执行时间: {current_time}")
return f"延迟任务执行成功: {current_time}"


@cron_task(cron_expression="*/2 * * * *", description="每2分钟执行一次的cron任务")
def my_cron_task():
"""每2分钟执行一次的cron任务"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
logger.info(f"[Cron任务] 执行时间: {current_time}")
return f"Cron任务执行成功: {current_time}"


# 创建示例路由

@app.route('/')
def index():
"""首页"""
return jsonify({
'message': 'Flask Scheduler 示例应用',
'scheduler_running': scheduler.is_running(),
'endpoints': {
'metrics': '/_internal/metrics',
'tasks': '/_internal/tasks',
'scheduler_status': '/_internal/scheduler/status',
'health': '/_internal/health'
}
})


@app.route('/run-task/<task_name>', methods=['POST'])
def run_task(task_name):
"""手动运行任务"""
success = scheduler.run_task(task_name)
if success:
return jsonify({'status': 'success', 'message': f'Task {task_name} started'})
else:
return jsonify({'status': 'error', 'message': f'Failed to start task {task_name}'}), 400


@app.route('/scheduler-info')
def scheduler_info():
"""获取调度器信息"""
tasks = scheduler.get_all_tasks()
metrics = scheduler.get_metrics()

return jsonify({
'scheduler_running': scheduler.is_running(),
'total_tasks': len(tasks),
'tasks': [task.name for task in tasks],
'metrics': metrics
})


# 注册管理蓝图
from flask.scheduler.blueprint import create_scheduler_blueprint
app.register_blueprint(create_scheduler_blueprint(scheduler, name='scheduler_admin'))

if __name__ == '__main__':
# 导入示例任务(确保它们被注册)
from flask.scheduler import examples # 这会触发任务注册

logger.info("启动Flask应用和调度器...")
app.run(debug=True, port=5000)
74 changes: 74 additions & 0 deletions scheduler_data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
{
"tasks": {
"my_interval_task": {
"name": "my_interval_task",
"task_type": "interval",
"description": "每10秒执行一次的示例任务",
"enabled": true,
"max_retries": 0,
"status": "running",
"next_run_at": "2025-11-29T15:41:23.195414",
"last_run_at": "2025-11-29T15:41:13.195410",
"current_run_id": "2b8af199-73c5-491a-a8b2-a945e35687d5",
"last_error": null,
"retry_count": 0,
"metrics": {
"total_runs": 38,
"successful_runs": 38,
"failed_runs": 0,
"last_run_at": "2025-11-29T15:41:13.201351",
"last_success_at": "2025-11-29T15:41:13.201355",
"last_failure_at": null,
"average_duration": 0.016269001867437103,
"last_error": null
}
},
"my_delay_task": {
"name": "my_delay_task",
"task_type": "delay",
"description": "延迟5秒后执行的示例任务",
"enabled": false,
"max_retries": 0,
"status": "success",
"next_run_at": null,
"last_run_at": "2025-11-29T15:35:06.924327",
"current_run_id": null,
"last_error": null,
"retry_count": 0,
"metrics": {
"total_runs": 1,
"successful_runs": 1,
"failed_runs": 0,
"last_run_at": "2025-11-29T15:35:06.926838",
"last_success_at": "2025-11-29T15:35:06.926846",
"last_failure_at": null,
"average_duration": 0.001039,
"last_error": null
}
},
"my_cron_task": {
"name": "my_cron_task",
"task_type": "cron",
"description": "每2分钟执行一次的cron任务",
"enabled": true,
"max_retries": 0,
"status": "success",
"next_run_at": "2025-11-29T15:42:00",
"last_run_at": "2025-11-29T15:40:59.069031",
"current_run_id": null,
"last_error": null,
"retry_count": 0,
"metrics": {
"total_runs": 176,
"successful_runs": 176,
"failed_runs": 0,
"last_run_at": "2025-11-29T15:40:59.070000",
"last_success_at": "2025-11-29T15:40:59.070004",
"last_failure_at": null,
"average_duration": 0.00045138152762598126,
"last_error": null
}
}
},
"last_updated": "2025-11-29T15:41:13.204217"
}
17 changes: 17 additions & 0 deletions src/flask/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,20 @@
from .templating import stream_template_string as stream_template_string
from .wrappers import Request as Request
from .wrappers import Response as Response

# Flask Scheduler Extension
try:
from .scheduler import Scheduler as Scheduler
from .scheduler import Task as Task
from .scheduler import TaskStatus as TaskStatus
from .scheduler import TaskType as TaskType
from .scheduler import interval_task as interval_task
from .scheduler import delay_task as delay_task
from .scheduler import cron_task as cron_task
from .scheduler import TaskStorage as TaskStorage
from .scheduler import SchedulerError as SchedulerError
from .scheduler import TaskError as TaskError
from .scheduler import CronParseError as CronParseError
except ImportError:
# 如果scheduler模块不可用,静默处理
pass
30 changes: 30 additions & 0 deletions src/flask/scheduler/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
"""
Flask Scheduler Extension

A comprehensive task scheduling extension for Flask applications with support for:
- Interval tasks
- Delayed tasks
- Cron tasks
- Task management and monitoring
- Metrics collection
"""

from .scheduler import Scheduler
from .tasks import Task, TaskStatus, TaskType
from .storage import TaskStorage
from .decorators import interval_task, delay_task, cron_task
from .exceptions import SchedulerError, TaskError, CronParseError

__all__ = [
'Scheduler',
'Task',
'TaskStatus',
'TaskType',
'TaskStorage',
'interval_task',
'delay_task',
'cron_task',
'SchedulerError',
'TaskError',
'CronParseError'
]
Loading
Loading