python apscheduler简单使用方法

1. ‌检查触发器类型和参数

APScheduler 支持多种触发器(intervalcrondate),不同的触发器配置可能导致立即执行。

场景 1:使用 interval 触发器

默认情况下,interval 触发器会立即执行一次,然后按间隔重复。如果不需要立即执行,需设置 start_date 为未来的时间:

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, timedelta

scheduler = BlockingScheduler()

# 设置 start_date 为当前时间 + 10 秒,避免立即执行
scheduler.add_job(
    your_job,
    'interval',
    seconds=60,  # 每 60 秒执行一次
    start_date=datetime.now() + timedelta(seconds=10)
)

scheduler.start()
场景 2:使用 cron 触发器

cron 触发器按时间规则执行,默认不会立即运行。但如果你设置了 next_run_time 参数,可能会覆盖首次执行时间:

scheduler.add_job(
    your_job,
    'cron',
    hour=10,  # 每天 10 点执行
    next_run_time=datetime.now() + timedelta(seconds=10)  # 首次执行在 10 秒后
)
场景 3:使用 date 触发器

date 触发器用于单次执行任务,需明确指定 run_date

from datetime import datetime, timedelta

scheduler.add_job(
    your_job,
    'date',
    run_date=datetime.now() + timedelta(minutes=5)  # 5 分钟后执行
)

2. ‌避免误用 next_run_time

如果在 add_job 时手动指定了 next_run_time,确保它不是一个过去的时间,否则任务会立即执行:

# ✅ 正确:设置未来时间
scheduler.add_job(your_job, 'interval', seconds=60, next_run_time=datetime.now() + timedelta(seconds=10))

# ❌ 错误:next_run_time 是过去时间,导致立即执行
scheduler.add_job(your_job, 'interval', seconds=60, next_run_time=datetime(2020, 1, 1))

3. ‌检查调度器启动方式

确保调度器正确启动且程序保持运行:

  • BlockingScheduler‌:会阻塞主线程,适合脚本直接运行。
  • BackgroundScheduler‌:需在后台运行,确保主线程不退出(如使用 sleep 或事件循环)。
    from apscheduler.schedulers.background import BackgroundScheduler
    import time
    
    scheduler = BackgroundScheduler()
    scheduler.start()
    
    # 防止主线程退出
    while True:
        time.sleep(10)

4. ‌完整示例:延迟首次执行

以下代码演示如何让任务在添加后 ‌10 秒‌ 首次执行,之后每分钟重复:

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, timedelta

def your_job():
    print("Job executed at:", datetime.now())

scheduler = BlockingScheduler()

# 首次执行在 10 秒后,之后每分钟执行一次
scheduler.add_job(
    your_job,
    'interval',
    minutes=1,
    start_date=datetime.now() + timedelta(seconds=10)
)

scheduler.start()

 

你可能感兴趣的:(python,数据库)