如何使用独立于程序 运行 开始时间的 apscheduler 每隔一小时执行一次 python 函数

How to execute a python function for every one hour exactly using apscheduler independent of program running start time

我有一个函数,使用 threading 模块每小时执行一次。但是我遇到了这个问题,

也就是说,该功能不会在几个小时后 运行 宁,比如在 10 - 12 小时后(这个时间是变化的)

def update_df():
    df = pd.read_sql(sql_query, connections['DB2'])
    threading.Timer(60*60*1, update_df).start()

update_df()

问题:

  1. 实现此功能的最佳做法是 应该 运行 每个 IST 小时(不是系统时间)?
  2. 为什么 threading 模块没有正常工作(是否有任何内置模块可以完成同样的工作)?

编辑-1:

你可以使用 python apscheduler。

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.configure(timezone='subcontinent/city')
scheduler.add_job(method-1, 'interval', seconds=10)
scheduler.add_job(method-2, 'interval', minutes=30)
scheduler.add_job(method-3, 'interval', hours=1)

//the below shceduler run mon-thu and sun on every o,15,30 and 45 minutes of each hour

scheduler.add_job(method, 'cron', minute='0,15,30,45', day_of_week='mon-thu,sun')
scheduler.start()

扩展@Harley 的答案,

您需要使用 trigger='cron' 而不是 'interval' 来每小时执行一次

Document

interval : This should be used when you want to run a function after fixed number of hours/minutes/seconds irrespective of day/month/year.

cron : This should be used when you want to run a function at a particular day/month/year at a particular hour/minute/second.

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.configure(timezone='Asia/Kolkata')
scheduler.add_job(method, trigger='cron', hour='*') # Execute every hour independent of execution time(i.e., 1:00:00, 2:00:00, so on..)
scheduler.add_job(method_1, 'interval', minutes=30) # Execute on every 30 minutes depends program execution time
scheduler.start()

要停止调度程序,请使用 .remove_all_jobs()

Ex: scheduler.remove_all_jobs()