From 8e92acf5d51e86ef8db31b23e0a4d32d796d24ba Mon Sep 17 00:00:00 2001 From: z66 <1415243231@qq.com> Date: Tue, 16 Sep 2025 14:41:24 +0800 Subject: [PATCH] =?UTF-8?q?minio=E5=AF=B9=E8=B1=A1=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/任务调度操作.md | 2 +- requirements.txt | 11 +- .../scheduler/task_management.py | 151 +++++--- tools/SQL.sql | 19 +- tools/task_manager.ipynb | 353 ++++++++++++++++-- 5 files changed, 455 insertions(+), 81 deletions(-) diff --git a/doc/任务调度操作.md b/doc/任务调度操作.md index ca75e36..39483e6 100644 --- a/doc/任务调度操作.md +++ b/doc/任务调度操作.md @@ -8,7 +8,7 @@ python system_management/scheduler/task_management.py list --active-only python system_management/scheduler/task_management.py show 1 # 更新任务Cron表达式 -python system_management/scheduler/task_management.py --cron "0 10 * * *" +python system_management/scheduler/task_management.py update --cron "0 10 * * *" # 启用任务 python system_management/scheduler/task_management.py toggle 1 --activate diff --git a/requirements.txt b/requirements.txt index a3310c8..6b55c7d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,17 @@ -cryptography==45.0.7 +croniter==3.0.3 dbutils==3.1.2 loguru==0.7.3 -numpy==2.3.2 +minio==7.2.16 +numpy==2.3.3 pandas==2.3.2 pymysql==1.1.2 pytest==8.4.2 +pytz==2025.2 Requests==2.32.5 SQLAlchemy==2.0.43 tenacity==9.1.2 +beautifulsoup4==4.13.5 +feedparser==6.0.11 +Markdown==3.9 +openai==1.107.3 +tqdm==4.67.1 diff --git a/system_management/scheduler/task_management.py b/system_management/scheduler/task_management.py index ace58d7..db27a56 100644 --- a/system_management/scheduler/task_management.py +++ b/system_management/scheduler/task_management.py @@ -3,6 +3,10 @@ from datetime import datetime from system_management.scheduler.task_scheduler import TaskScheduler from system_management.scheduler.task_manager import TaskManager from config.config import ConfigManager +from utils.logger import CrossPlatformLog + +# 初始化日志 +log = CrossPlatformLog.get_logger("TaskManagement") def main(): @@ -58,67 +62,111 @@ def main(): # 执行相应命令 if args.command == "list": - tasks = manager.get_all_tasks(args.active_only) - manager.print_task_table(tasks) + try: + tasks = manager.get_all_tasks(args.active_only) + manager.print_task_table(tasks) + log.info(f"列出任务完成,共{len(tasks)}个任务") + except Exception as e: + log.error(f"列出任务失败: {str(e)}", exc_info=True) elif args.command == "show": - task = manager.get_task_by_id(args.task_id) - if task: - print("\n===== 任务详情 =====") - for key, value in task.items(): - print(f"{key}: {value}") - print("====================") + try: + task = manager.get_task_by_id(args.task_id) + if task: + print("\n===== 任务详情 =====") + for key, value in task.items(): + print(f"{key}: {value}") + print("====================") + log.info(f"显示任务详情成功,任务ID: {args.task_id}") + else: + log.warning(f"未找到任务ID: {args.task_id}") + print(f"任务ID {args.task_id} 不存在") + except Exception as e: + log.error(f"显示任务详情失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "update": - updates = {} - if args.name: - updates['task_name'] = args.name - if args.type: - updates['task_type'] = args.type - if args.module: - updates['module_path'] = args.module - if args.cron: - updates['cron_expression'] = args.cron - if args.timezone: - updates['time_zone'] = args.timezone + try: + updates = {} + if args.name: + updates['task_name'] = args.name + if args.type: + updates['task_type'] = args.type + if args.module: + updates['module_path'] = args.module + if args.cron: + updates['cron_expression'] = args.cron + if args.timezone: + updates['time_zone'] = args.timezone - if manager.update_task(args.task_id, updates): - print(f"任务ID {args.task_id} 更新成功") - else: - print(f"任务ID {args.task_id} 更新失败") + if not updates: + log.warning("未提供任何更新字段") + print("请至少指定一个更新字段") + return + + if manager.update_task(args.task_id, updates): + log.info(f"任务ID {args.task_id} 更新成功") + print(f"任务ID {args.task_id} 更新成功") + else: + log.warning(f"任务ID {args.task_id} 更新失败") + print(f"任务ID {args.task_id} 更新失败") + except Exception as e: + log.error(f"更新任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "toggle": - if args.activate: - success = manager.toggle_task_status(args.task_id, True) - action = "启用" - elif args.deactivate: - success = manager.toggle_task_status(args.task_id, False) - action = "禁用" - else: - print("请指定 --activate 或 --deactivate") - return + try: + if args.activate and args.deactivate: + log.warning("不能同时指定 --activate 和 --deactivate") + print("不能同时指定 --activate 和 --deactivate") + return + if not args.activate and not args.deactivate: + log.warning("请指定 --activate 或 --deactivate") + print("请指定 --activate 或 --deactivate") + return - if success: - print(f"任务ID {args.task_id} {action}成功") - else: - print(f"任务ID {args.task_id} {action}失败") + if args.activate: + success = manager.toggle_task_status(args.task_id, True) + action = "启用" + else: + success = manager.toggle_task_status(args.task_id, False) + action = "禁用" + + if success: + log.info(f"任务ID {args.task_id} {action}成功") + print(f"任务ID {args.task_id} {action}成功") + else: + log.warning(f"任务ID {args.task_id} {action}失败") + print(f"任务ID {args.task_id} {action}失败") + except Exception as e: + log.error(f"切换任务状态失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "delete": - confirm = input(f"确定要删除任务ID {args.task_id} 吗? (y/n) ") - if confirm.lower() == 'y': - if manager.delete_task(args.task_id): - print(f"任务ID {args.task_id} 删除成功") + try: + confirm = input(f"确定要删除任务ID {args.task_id} 吗? (y/n) ") + if confirm.lower() == 'y': + if manager.delete_task(args.task_id): + log.info(f"任务ID {args.task_id} 删除成功") + print(f"任务ID {args.task_id} 删除成功") + else: + log.warning(f"任务ID {args.task_id} 删除失败") + print(f"任务ID {args.task_id} 删除失败") else: - print(f"任务ID {args.task_id} 删除失败") - else: - print("操作已取消") + log.info(f"用户取消删除任务ID {args.task_id}") + print("操作已取消") + except Exception as e: + log.error(f"删除任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "run": - print(f"正在手动执行任务ID {args.task_id}...") - if manager.run_task_manually(args.task_id): - print(f"任务ID {args.task_id} 执行成功") - else: - print(f"任务ID {args.task_id} 执行失败") + try: + log.info(f"开始手动执行任务ID {args.task_id}") + print(f"正在手动执行任务ID {args.task_id}...") + if manager.run_task_manually(args.task_id): + log.info(f"任务ID {args.task_id} 执行成功") + print(f"任务ID {args.task_id} 执行成功") + else: + log.warning(f"任务ID {args.task_id} 执行失败") + print(f"任务ID {args.task_id} 执行失败") + except Exception as e: + log.error(f"手动执行任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "add": try: @@ -129,10 +177,15 @@ def main(): cron_expression=args.cron, time_zone=args.timezone ) + log.info(f"新任务添加成功,ID: {task_id}") print(f"新任务添加成功,ID: {task_id}") except Exception as e: + log.error(f"添加任务失败: {str(e)}", exc_info=True) print(f"添加任务失败: {str(e)}") + else: + parser.print_help() + if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/tools/SQL.sql b/tools/SQL.sql index a7fac10..04a861c 100644 --- a/tools/SQL.sql +++ b/tools/SQL.sql @@ -1 +1,18 @@ -DROP DATABASE test \ No newline at end of file +CREATE TABLE IF NOT EXISTS main_task ( + task_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '任务唯一ID', + task_name VARCHAR(100) NOT NULL COMMENT '任务名称', + task_type VARCHAR(50) NOT NULL COMMENT '任务类型(如processor、collector等)', + module_path VARCHAR(255) NOT NULL COMMENT '任务模块路径(如processors.data_checker)', + cron_expression VARCHAR(100) NOT NULL COMMENT 'Cron表达式(调度频率)', + time_zone VARCHAR(50) DEFAULT 'Asia/Shanghai' COMMENT '时区', -- 补充此字段 + next_run_time DATETIME NOT NULL COMMENT '下次运行时间', + last_run_time DATETIME NULL COMMENT '上次运行时间', + last_run_status ENUM('success', 'failed', 'pending') DEFAULT 'pending' COMMENT '上次运行状态', + run_count INT DEFAULT 0 COMMENT '运行次数统计', + is_active TINYINT(1) DEFAULT 1 COMMENT '是否活跃(1=启用,0=禁用)', + is_running TINYINT(1) DEFAULT 0 COMMENT '是否正在运行(1=运行中,0=未运行)', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + INDEX idx_next_run (next_run_time) COMMENT '优化下次运行时间查询', -- 建议保留索引提升性能 + INDEX idx_active (is_active) COMMENT '优化活跃任务查询' -- 建议保留索引提升性能 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务调度主表'; \ No newline at end of file diff --git a/tools/task_manager.ipynb b/tools/task_manager.ipynb index ea8ccea..8194221 100644 --- a/tools/task_manager.ipynb +++ b/tools/task_manager.ipynb @@ -8,38 +8,335 @@ }, { "cell_type": "code", - "execution_count": null, "id": "initial_id", "metadata": { - "collapsed": true + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-12T06:19:31.379133Z", + "start_time": "2025-09-12T06:19:30.001155Z" + } }, - "outputs": [], "source": [ - "# 初始化任务管理所需组件\n", - "import pandas as pd\n", - "from IPython.display import display, HTML, Markdown\n", - "from datetime import datetime\n", - "\n", - "# 导入系统组件\n", - "from system_management.scheduler.task_scheduler import TaskScheduler\n", - "from system_management.scheduler.task_manager import TaskManager\n", - "from config.config import ConfigManager\n", - "\n", - "# 初始化配置和管理器\n", - "config = ConfigManager()\n", - "scheduler = TaskScheduler(config.get(\"database\"))\n", - "manager = TaskManager(scheduler)\n", - "\n", - "# 设置显示样式\n", - "pd.set_option('display.max_colwidth', 100)\n", - "pd.set_option('display.width', 1000)\n", - "\n", - "def format_datetime(dt):\n", - " \"\"\"格式化日期时间显示\"\"\"\n", - " if pd.isna(dt) or dt is None:\n", - " return \"从未执行\"\n", - " return pd.to_datetime(dt).strftime('%Y-%m-%d %H:%M:%S')" - ] + "{\n", + " \"cells\": [\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# TaskManager 任务管理类\\n\",\n", + " \"任务管理核心组件,负责任务的CRUD、状态切换、手动执行等操作\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": null,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"import pandas as pd\\n\",\n", + " \"from datetime import datetime\\n\",\n", + " \"from typing import Dict, List, Optional, Any\\n\",\n", + " \"import pytz\\n\",\n", + " \"import croniter\\n\",\n", + " \"\\n\",\n", + " \"from utils.mysql_agent import MySQLAgent\\n\",\n", + " \"from utils.logger import CrossPlatformLog\\n\",\n", + " \"from system_management.scheduler.task_scheduler import TaskScheduler\\n\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": null,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"class TaskManager:\\n\",\n", + " \" def __init__(self, scheduler: TaskScheduler):\\n\",\n", + " \" \\\"\\\"\\\"初始化任务管理器\\n\",\n", + " \" Args:\\n\",\n", + " \" scheduler: 任务调度器实例\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" self.scheduler = scheduler\\n\",\n", + " \" self.db = scheduler.db # 复用调度器的数据库连接\\n\",\n", + " \" self.log = CrossPlatformLog.get_logger(\\\"TaskManager\\\")\\n\",\n", + " \"\\n\",\n", + " \" def get_all_tasks(self, active_only: bool = False) -> List[Dict[str, Any]]:\\n\",\n", + " \" \\\"\\\"\\\"获取所有任务列表\\n\",\n", + " \" Args:\\n\",\n", + " \" active_only: 是否只返回活跃任务\\n\",\n", + " \" Returns:\\n\",\n", + " \" 任务字典列表\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" try:\\n\",\n", + " \" query = \\\"SELECT * FROM main_task\\\"\\n\",\n", + " \" params = []\\n\",\n", + " \" if active_only:\\n\",\n", + " \" query += \\\" WHERE is_active = 1\\\"\\n\",\n", + " \" query += \\\" ORDER BY task_id\\\"\\n\",\n", + " \"\\n\",\n", + " \" tasks_df = self.db.query_to_df(query, params=params)\\n\",\n", + " \" return tasks_df.to_dict('records')\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.log.error(\\\"获取任务列表失败\\\", exc_info=True)\\n\",\n", + " \" return []\\n\",\n", + " \"\\n\",\n", + " \" def get_task_by_id(self, task_id: int) -> Optional[Dict[str, Any]]:\\n\",\n", + " \" \\\"\\\"\\\"通过ID获取任务详情\\n\",\n", + " \" Args:\\n\",\n", + " \" task_id: 任务ID\\n\",\n", + " \" Returns:\\n\",\n", + " \" 任务字典,不存在则返回None\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" try:\\n\",\n", + " \" task_df = self.db.query_to_df(\\n\",\n", + " \" \\\"SELECT * FROM main_task WHERE task_id = %s\\\",\\n\",\n", + " \" params=(task_id,)\\n\",\n", + " \" )\\n\",\n", + " \" if task_df.empty:\\n\",\n", + " \" return None\\n\",\n", + " \" return task_df.iloc[0].to_dict()\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.log.error(f\\\"获取任务详情失败 (ID: {task_id})\\\")\\n\",\n", + " \" return None\\n\",\n", + " \"\\n\",\n", + " \" def update_task(self, task_id: int, updates: Dict[str, Any]) -> bool:\\n\",\n", + " \" \\\"\\\"\\\"更新任务属性\\n\",\n", + " \" Args:\\n\",\n", + " \" task_id: 任务ID\\n\",\n", + " \" updates: 需要更新的字段字典\\n\",\n", + " \" Returns:\\n\",\n", + " \" 更新是否成功\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" if not updates:\\n\",\n", + " \" self.log.warning(\\\"未提供更新字段\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" try:\\n\",\n", + " \" # 处理Cron表达式更新(需重新计算下次运行时间)\\n\",\n", + " \" if 'cron_expression' in updates or 'time_zone' in updates:\\n\",\n", + " \" task = self.get_task_by_id(task_id)\\n\",\n", + " \" if not task:\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" cron_expr = updates.get('cron_expression', task['cron_expression'])\\n\",\n", + " \" time_zone = updates.get('time_zone', task['time_zone'])\\n\",\n", + " \" updates['next_run_time'] = self.scheduler._calculate_next_run_time(cron_expr, time_zone)\\n\",\n", + " \"\\n\",\n", + " \" # 执行更新\\n\",\n", + " \" self.scheduler._update_task_status(task_id, updates)\\n\",\n", + " \" self.log.info(f\\\"任务更新成功 (ID: {task_id})\\\")\\n\",\n", + " \" return True\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.log.error(f\\\"任务更新失败 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" def toggle_task_status(self, task_id: int, activate: bool) -> bool:\\n\",\n", + " \" \\\"\\\"\\\"切换任务激活状态\\n\",\n", + " \" Args:\\n\",\n", + " \" task_id: 任务ID\\n\",\n", + " \" activate: True=激活, False=禁用\\n\",\n", + " \" Returns:\\n\",\n", + " \" 操作是否成功\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" try:\\n\",\n", + " \" status = 1 if activate else 0\\n\",\n", + " \" # 激活时重新计算下次运行时间\\n\",\n", + " \" updates = {'is_active': status}\\n\",\n", + " \" if activate:\\n\",\n", + " \" task = self.get_task_by_id(task_id)\\n\",\n", + " \" if task:\\n\",\n", + " \" updates['next_run_time'] = self.scheduler._calculate_next_run_time(\\n\",\n", + " \" task['cron_expression'], task['time_zone']\\n\",\n", + " \" )\\n\",\n", + " \"\\n\",\n", + " \" self.scheduler._update_task_status(task_id, updates)\\n\",\n", + " \" self.log.info(f\\\"任务{'激活' if activate else '禁用'}成功 (ID: {task_id})\\\")\\n\",\n", + " \" return True\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.log.error(f\\\"任务状态切换失败 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" def delete_task(self, task_id: int) -> bool:\\n\",\n", + " \" \\\"\\\"\\\"删除任务\\n\",\n", + " \" Args:\\n\",\n", + " \" task_id: 任务ID\\n\",\n", + " \" Returns:\\n\",\n", + " \" 删除是否成功\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" try:\\n\",\n", + " \" # 检查任务是否存在\\n\",\n", + " \" if not self.get_task_by_id(task_id):\\n\",\n", + " \" self.log.warning(f\\\"任务不存在 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" # 执行删除\\n\",\n", + " \" self.db.execute_sql(\\n\",\n", + " \" \\\"DELETE FROM main_task WHERE task_id = %s\\\",\\n\",\n", + " \" params=(task_id,)\\n\",\n", + " \" )\\n\",\n", + " \" self.log.info(f\\\"任务删除成功 (ID: {task_id})\\\")\\n\",\n", + " \" return True\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.log.error(f\\\"任务删除失败 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" def run_task_manually(self, task_id: int) -> bool:\\n\",\n", + " \" \\\"\\\"\\\"手动执行任务\\n\",\n", + " \" Args:\\n\",\n", + " \" task_id: 任务ID\\n\",\n", + " \" Returns:\\n\",\n", + " \" 执行是否成功\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" try:\\n\",\n", + " \" task = self.get_task_by_id(task_id)\\n\",\n", + " \" if not task:\\n\",\n", + " \" self.log.warning(f\\\"任务不存在 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" # 标记任务为运行中\\n\",\n", + " \" self.scheduler._update_task_status(task_id, {\\n\",\n", + " \" 'is_running': 1,\\n\",\n", + " \" 'last_run_time': datetime.now()\\n\",\n", + " \" })\\n\",\n", + " \"\\n\",\n", + " \" # 执行任务逻辑\\n\",\n", + " \" self.scheduler._execute_task_logic(task)\\n\",\n", + " \"\\n\",\n", + " \" # 更新任务状态\\n\",\n", + " \" next_run_time = self.scheduler._calculate_next_run_time(\\n\",\n", + " \" task['cron_expression'], task['time_zone']\\n\",\n", + " \" )\\n\",\n", + " \" self.scheduler._update_task_status(task_id, {\\n\",\n", + " \" 'is_running': 0,\\n\",\n", + " \" 'last_run_status': 'success',\\n\",\n", + " \" 'run_count': task['run_count'] + 1,\\n\",\n", + " \" 'next_run_time': next_run_time\\n\",\n", + " \" })\\n\",\n", + " \" return True\\n\",\n", + " \" except Exception as e:\\n\",\n", + " \" self.scheduler._update_task_status(task_id, {\\n\",\n", + " \" 'is_running': 0,\\n\",\n", + " \" 'last_run_status': 'failed'\\n\",\n", + " \" })\\n\",\n", + " \" self.log.error(f\\\"任务手动执行失败 (ID: {task_id})\\\")\\n\",\n", + " \" return False\\n\",\n", + " \"\\n\",\n", + " \" def print_task_table(self, tasks: List[Dict[str, Any]]) -> None:\\n\",\n", + " \" \\\"\\\"\\\"格式化打印任务列表\\n\",\n", + " \" Args:\\n\",\n", + " \" tasks: 任务列表\\n\",\n", + " \" \\\"\\\"\\\"\\n\",\n", + " \" if not tasks:\\n\",\n", + " \" print(\\\"没有任务数据\\\")\\n\",\n", + " \" return\\n\",\n", + " \"\\n\",\n", + " \" # 转换为DataFrame并筛选显示字段\\n\",\n", + " \" df = pd.DataFrame(tasks)\\n\",\n", + " \" display_cols = [\\n\",\n", + " \" 'task_id', 'task_name', 'task_type', 'cron_expression',\\n\",\n", + " \" 'is_active', 'last_run_status', 'next_run_time'\\n\",\n", + " \" ]\\n\",\n", + " \" # 处理状态显示\\n\",\n", + " \" df['is_active'] = df['is_active'].map({1: '活跃', 0: '禁用'})\\n\",\n", + " \" print(f\\\"共 {len(df)} 个任务\\\\n\\\")\\n\",\n", + " \" print(df[display_cols].to_string(index=False))\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 使用示例\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": null,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"# 初始化示例\\n\",\n", + " \"from config.config import ConfigManager\\n\",\n", + " \"\\n\",\n", + " \"# 加载配置\\n\",\n", + " \"config = ConfigManager()\\n\",\n", + " \"scheduler = TaskScheduler(config.get(\\\"database\\\"))\\n\",\n", + " \"manager = TaskManager(scheduler)\\n\",\n", + " \"\\n\",\n", + " \"# 1. 列出所有任务\\n\",\n", + " \"all_tasks = manager.get_all_tasks()\\n\",\n", + " \"manager.print_task_table(all_tasks)\\n\",\n", + " \"\\n\",\n", + " \"# 2. 获取单个任务详情\\n\",\n", + " \"task = manager.get_task_by_id(1)\\n\",\n", + " \"if task:\\n\",\n", + " \" print(\\\"\\\\n任务详情:\\\")\\n\",\n", + " \" for k, v in task.items():\\n\",\n", + " \" print(f\\\"{k}: {v}\\\")\\n\",\n", + " \"\\n\",\n", + " \"# 3. 更新任务Cron表达式\\n\",\n", + " \"manager.update_task(1, {'cron_expression': '0 */2 * * *'})\\n\",\n", + " \"\\n\",\n", + " \"# 4. 激活任务\\n\",\n", + " \"manager.toggle_task_status(1, activate=True)\\n\",\n", + " \"\\n\",\n", + " \"# 5. 手动执行任务\\n\",\n", + " \"manager.run_task_manually(1)\\n\",\n", + " \"\\n\",\n", + " \"# 6. 删除任务(谨慎操作)\\n\",\n", + " \"# manager.delete_task(1)\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 核心功能说明\\n\",\n", + " \"- 依赖 `TaskScheduler` 实现底层调度逻辑与数据库交互\\n\",\n", + " \"- 支持任务全生命周期管理(查询/更新/激活/执行/删除)\\n\",\n", + " \"- 内置日志记录与错误处理\\n\",\n", + " \"- 兼容Windows/macOS/Linux多平台\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"kernelspec\": {\n", + " \"display_name\": \"Python 3\",\n", + " \"language\": \"python\",\n", + " \"name\": \"python3\"\n", + " },\n", + " \"language_info\": {\n", + " \"codemirror_mode\": {\n", + " \"name\": \"ipython\",\n", + " \"version\": 3\n", + " },\n", + " \"file_extension\": \".py\",\n", + " \"mimetype\": \"text/x-python\",\n", + " \"name\": \"python\",\n", + " \"nbconvert_exporter\": \"python\",\n", + " \"pygments_lexer\": \"ipython3\",\n", + " \"version\": \"3.8.10\"\n", + " }\n", + " },\n", + " \"nbformat\": 4,\n", + " \"nbformat_minor\": 4\n", + "}" + ], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'system_management.scheduler.task_manager'", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mModuleNotFoundError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[1]\u001B[39m\u001B[32m, line 8\u001B[39m\n\u001B[32m 6\u001B[39m \u001B[38;5;66;03m# 导入系统组件\u001B[39;00m\n\u001B[32m 7\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01msystem_management\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mscheduler\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mtask_scheduler\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m TaskScheduler\n\u001B[32m----> \u001B[39m\u001B[32m8\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01msystem_management\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mscheduler\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mtask_management\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m TaskManager\n\u001B[32m 9\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01mconfig\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m Config\n\u001B[32m 11\u001B[39m \u001B[38;5;66;03m# 初始化配置和管理器\u001B[39;00m\n", + "\u001B[36mFile \u001B[39m\u001B[32mD:\\Idea Project\\intelligence_system\\system_management\\scheduler\\task_management.py:4\u001B[39m\n\u001B[32m 2\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01mdatetime\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m datetime\n\u001B[32m 3\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01msystem_management\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mscheduler\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mtask_scheduler\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m TaskScheduler\n\u001B[32m----> \u001B[39m\u001B[32m4\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01msystem_management\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mscheduler\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mtask_manager\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m TaskManager\n\u001B[32m 5\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01mconfig\u001B[39;00m\u001B[34;01m.\u001B[39;00m\u001B[34;01mconfig\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m ConfigManager\n\u001B[32m 8\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mmain\u001B[39m():\n\u001B[32m 9\u001B[39m \u001B[38;5;66;03m# 初始化配置和组件\u001B[39;00m\n", + "\u001B[31mModuleNotFoundError\u001B[39m: No module named 'system_management.scheduler.task_manager'" + ] + } + ], + "execution_count": 1 }, { "metadata": {},