默认保留 30 天,可通过环境变量 SIGNIN_LOG_RETAIN_DAYS 调整 每天凌晨 3 点执行,错开签到高峰 有完整日志记录删了多少条、截止日期是什么 用独立 engine 避免之前的 event loop 问题
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
"""
|
||
Weibo-HotSign Task Scheduler Service
|
||
Celery app + Beat configuration.
|
||
|
||
策略:每 5 分钟运行一次 check_and_run_due_tasks,
|
||
该任务从数据库读取所有 enabled 的 Task,用 croniter 判断
|
||
当前时间是否在 cron 窗口内(±3 分钟),如果是则提交签到。
|
||
这样无需动态修改 beat_schedule,简单可靠。
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import logging
|
||
|
||
from celery import Celery
|
||
from celery.schedules import crontab
|
||
|
||
# 确保 shared 模块可导入
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../.."))
|
||
|
||
from .config import settings
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Create Celery app
|
||
celery_app = Celery(
|
||
"weibo_scheduler",
|
||
broker=settings.CELERY_BROKER_URL,
|
||
backend=settings.CELERY_RESULT_BACKEND,
|
||
include=["task_scheduler.app.tasks.signin_tasks"],
|
||
)
|
||
|
||
celery_app.conf.update(
|
||
task_serializer="json",
|
||
accept_content=["json"],
|
||
result_serializer="json",
|
||
timezone="Asia/Shanghai",
|
||
enable_utc=False,
|
||
beat_schedule_filename="/tmp/celerybeat-schedule",
|
||
beat_max_loop_interval=60,
|
||
beat_schedule={
|
||
"check-due-tasks": {
|
||
"task": "task_scheduler.app.tasks.signin_tasks.check_and_run_due_tasks",
|
||
"schedule": 60.0, # 每分钟检查一次(轻量查询,只在到期前 5 分钟才真正提交)
|
||
},
|
||
"cleanup-old-logs": {
|
||
"task": "task_scheduler.app.tasks.signin_tasks.cleanup_old_signin_logs",
|
||
"schedule": crontab(hour=3, minute=0), # 每天凌晨 3 点
|
||
},
|
||
},
|
||
)
|
||
|
||
# 导入 task 模块以注册
|
||
from .tasks import signin_tasks # noqa: F401, E402
|