APScheduler 支持多种触发器(interval
、cron
、date
),不同的触发器配置可能导致立即执行。
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()
cron
触发器cron
触发器按时间规则执行,默认不会立即运行。但如果你设置了 next_run_time
参数,可能会覆盖首次执行时间:
scheduler.add_job(
your_job,
'cron',
hour=10, # 每天 10 点执行
next_run_time=datetime.now() + timedelta(seconds=10) # 首次执行在 10 秒后
)
date
触发器date
触发器用于单次执行任务,需明确指定 run_date
:
from datetime import datetime, timedelta
scheduler.add_job(
your_job,
'date',
run_date=datetime.now() + timedelta(minutes=5) # 5 分钟后执行
)
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))
确保调度器正确启动且程序保持运行:
sleep
或事件循环)。 from apscheduler.schedulers.background import BackgroundScheduler
import time
scheduler = BackgroundScheduler()
scheduler.start()
# 防止主线程退出
while True:
time.sleep(10)
以下代码演示如何让任务在添加后 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()