如何使用独立于程序 运行 开始时间的 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()
问题:
- 实现此功能的最佳做法是
应该 运行 每个 IST 小时(不是系统时间)?
- 为什么
threading
模块没有正常工作(是否有任何内置模块可以完成同样的工作)?
编辑-1:
- 问题1已解决
- 问题 2 需要更多的知名度
你可以使用 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'
来每小时执行一次
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()
我有一个函数,使用 threading
模块每小时执行一次。但是我遇到了这个问题,
也就是说,该功能不会在几个小时后 运行 宁,比如在 10 - 12 小时后(这个时间是变化的)
def update_df():
df = pd.read_sql(sql_query, connections['DB2'])
threading.Timer(60*60*1, update_df).start()
update_df()
问题:
- 实现此功能的最佳做法是 应该 运行 每个 IST 小时(不是系统时间)?
- 为什么
threading
模块没有正常工作(是否有任何内置模块可以完成同样的工作)?
编辑-1:
- 问题1已解决
- 问题 2 需要更多的知名度
你可以使用 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'
来每小时执行一次
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()