add:调度任务
This commit is contained in:
218
docling/app/component/ScheduledTaskManager.py
Normal file
218
docling/app/component/ScheduledTaskManager.py
Normal file
@@ -0,0 +1,218 @@
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from apscheduler.triggers.cron import CronTrigger
|
||||
from datetime import datetime
|
||||
import time
|
||||
import logging
|
||||
|
||||
# 配置日志
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ScheduledTaskManager:
|
||||
def __init__(self):
|
||||
"""初始化调度器"""
|
||||
self.scheduler = BackgroundScheduler()
|
||||
self.jobs = {}
|
||||
# 添加“日”周期任务
|
||||
def add_second_task(self, task_id,second, task_func, args=None, kwargs=None):
|
||||
|
||||
trigger = CronTrigger(second=second)
|
||||
job = self.scheduler.add_job(
|
||||
task_func, trigger, id=task_id,
|
||||
args=args, kwargs=kwargs
|
||||
)
|
||||
self.jobs[task_id] = job
|
||||
logger.info(f"已添加每秒任务: {task_id}, 执行时间: {second:02d}")
|
||||
|
||||
# 添加“日”周期任务
|
||||
def add_daily_task(self, task_id, hour, minute, task_func, args=None, kwargs=None):
|
||||
"""添加每日定时任务
|
||||
|
||||
Args:
|
||||
task_id: 任务唯一标识
|
||||
hour: 小时 (0-23)
|
||||
minute: 分钟 (0-59)
|
||||
task_func: 任务函数
|
||||
args: 位置参数
|
||||
kwargs: 关键字参数
|
||||
"""
|
||||
trigger = CronTrigger(hour=hour, minute=minute)
|
||||
job = self.scheduler.add_job(
|
||||
task_func, trigger, id=task_id,
|
||||
args=args, kwargs=kwargs
|
||||
)
|
||||
self.jobs[task_id] = job
|
||||
logger.info(f"已添加每日任务: {task_id}, 执行时间: {hour:02d}:{minute:02d}")
|
||||
|
||||
# 添加“月”周期任务
|
||||
def add_monthly_task(self, task_id, day, hour, minute, task_func, args=None, kwargs=None):
|
||||
"""添加每月定时任务
|
||||
|
||||
Args:
|
||||
task_id: 任务唯一标识
|
||||
day: 日 (1-31)
|
||||
hour: 小时 (0-23)
|
||||
minute: 分钟 (0-59)
|
||||
"""
|
||||
trigger = CronTrigger(day=day, hour=hour, minute=minute)
|
||||
job = self.scheduler.add_job(
|
||||
task_func, trigger, id=task_id,
|
||||
args=args, kwargs=kwargs
|
||||
)
|
||||
self.jobs[task_id] = job
|
||||
logger.info(f"已添加每月任务: {task_id}, 执行时间: 每月{day}日 {hour:02d}:{minute:02d}")
|
||||
|
||||
def add_hourly_task(self, task_id, minute, task_func, args=None, kwargs=None):
|
||||
"""添加每小时定时任务
|
||||
|
||||
Args:
|
||||
task_id: 任务唯一标识
|
||||
minute: 分钟 (0-59)
|
||||
"""
|
||||
trigger = CronTrigger(minute=minute)
|
||||
job = self.scheduler.add_job(
|
||||
task_func, trigger, id=task_id,
|
||||
args=args, kwargs=kwargs
|
||||
)
|
||||
self.jobs[task_id] = job
|
||||
logger.info(f"已添加每小时任务: {task_id}, 执行时间: 每小时的{minute:02d}分")
|
||||
|
||||
def add_interval_task(self, task_id, interval_type, value, task_func, args=None, kwargs=None):
|
||||
"""添加间隔任务(备用方案)
|
||||
|
||||
Args:
|
||||
task_id: 任务唯一标识
|
||||
interval_type: 'seconds', 'minutes', 'hours', 'days'
|
||||
value: 间隔值
|
||||
"""
|
||||
from apscheduler.triggers.interval import IntervalTrigger
|
||||
|
||||
if interval_type == 'seconds':
|
||||
trigger = IntervalTrigger(seconds=value)
|
||||
elif interval_type == 'minutes':
|
||||
trigger = IntervalTrigger(minutes=value)
|
||||
elif interval_type == 'hours':
|
||||
trigger = IntervalTrigger(hours=value)
|
||||
elif interval_type == 'days':
|
||||
trigger = IntervalTrigger(days=value)
|
||||
else:
|
||||
raise ValueError(f"不支持的间隔类型: {interval_type}")
|
||||
|
||||
job = self.scheduler.add_job(
|
||||
task_func, trigger, id=task_id,
|
||||
args=args, kwargs=kwargs
|
||||
)
|
||||
self.jobs[task_id] = job
|
||||
logger.info(f"已添加间隔任务: {task_id}, 间隔: 每{value}{interval_type}")
|
||||
|
||||
# 移除任务
|
||||
def remove_task(self, task_id):
|
||||
"""移除任务"""
|
||||
if task_id in self.jobs:
|
||||
self.scheduler.remove_job(task_id)
|
||||
del self.jobs[task_id]
|
||||
logger.info(f"已移除任务: {task_id}")
|
||||
|
||||
# 暂停任务
|
||||
def pause_task(self, task_id):
|
||||
"""暂停任务"""
|
||||
if task_id in self.jobs:
|
||||
self.jobs[task_id].pause()
|
||||
logger.info(f"已暂停任务: {task_id}")
|
||||
|
||||
# 重启任务
|
||||
def resume_task(self, task_id):
|
||||
"""恢复任务"""
|
||||
if task_id in self.jobs:
|
||||
self.jobs[task_id].resume()
|
||||
logger.info(f"已恢复任务: {task_id}")
|
||||
|
||||
# 获取全部任务
|
||||
def get_all_tasks(self):
|
||||
"""获取所有任务信息"""
|
||||
tasks_info = []
|
||||
for job_id, job in self.jobs.items():
|
||||
tasks_info.append({
|
||||
'id': job_id,
|
||||
'name': job.name,
|
||||
'next_run_time': job.next_run_time,
|
||||
'trigger': str(job.trigger)
|
||||
})
|
||||
return tasks_info
|
||||
|
||||
#启动任务
|
||||
def start(self):
|
||||
"""启动调度器"""
|
||||
self.scheduler.start()
|
||||
logger.info("调度器已启动")
|
||||
|
||||
# 关闭
|
||||
def shutdown(self):
|
||||
"""关闭调度器"""
|
||||
self.scheduler.shutdown()
|
||||
logger.info("调度器已关闭")
|
||||
|
||||
|
||||
# 示例任务函数
|
||||
def sample_task(task_name, *args, **kwargs):
|
||||
"""示例任务函数"""
|
||||
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
print(f"[{now}] 执行任务: {task_name}")
|
||||
if args:
|
||||
print(f"位置参数: {args}")
|
||||
if kwargs:
|
||||
print(f"关键字参数: {kwargs}")
|
||||
print("-" * 50)
|
||||
print()
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
# 创建任务管理器
|
||||
manager = ScheduledTaskManager()
|
||||
|
||||
# 启动调度器
|
||||
manager.start()
|
||||
|
||||
try:
|
||||
# 添加每日任务 (每天10:30执行)
|
||||
manager.add_second_task(
|
||||
task_id="daily_report",
|
||||
second=10,
|
||||
task_func=sample_task,
|
||||
args=("每日报告",),
|
||||
kwargs={"type": "second"}
|
||||
)
|
||||
#
|
||||
# # 添加每月任务 (每月1日9:00执行)
|
||||
# manager.add_monthly_task(
|
||||
# task_id="monthly_summary",
|
||||
# day=1,
|
||||
# hour=9, 12354354345321.21135432213245322154373554
|
||||
# minute=0,
|
||||
# task_func=sample_task,
|
||||
# args=("月度汇总",)
|
||||
# )
|
||||
#
|
||||
# # 添加每小时任务 (每小时的第15分钟执行)
|
||||
# manager.add_hourly_task(
|
||||
# task_id="hourly_check",
|
||||
# minute=15,
|
||||
# task_func=sample_task,
|
||||
# args=("每小时检查",)
|
||||
# )
|
||||
|
||||
# 查看任务列表
|
||||
print("当前任务列表:")
|
||||
for task in manager.get_all_tasks():
|
||||
print(f" - {task['id']}: 下次执行时间: {task['next_run_time']}")
|
||||
|
||||
# 保持程序运行
|
||||
while True:
|
||||
time.sleep(1)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n收到中断信号,正在关闭...")
|
||||
finally:
|
||||
manager.shutdown()
|
||||
@@ -26,3 +26,4 @@ safetensors
|
||||
scipy
|
||||
opencv-python
|
||||
pymupdf
|
||||
apscheduler
|
||||
|
||||
Reference in New Issue
Block a user