为什么我配置的schedule定时任务未到触发时间就自动连续运行?
问题原因及解决方案
- 你当前启用的调度规则为
schedule.every(1).minutes.do(main),该规则本身逻辑就是每隔1分钟触发一次main函数运行,自然会出现重复执行的情况。如果你需要仅在每天固定的16:30触发,注释掉每分钟执行的规则,取消上方固定时间调度规则的注释即可。 - 代码存在变量未定义的错误:main函数中调用
MergeZips(df2,df1)时,df1并没有被定义,你之前查询Snowflake得到的结果变量名为DFsnow,变量名不匹配会导致main函数运行时报错。schedule库对于执行失败的任务不会标记为已完成,会在每次run_pending检查时重试执行,这是脚本看起来持续不停运行的核心原因。 - 确认你在代码开头已经导入了所需的依赖库,缺失导入也会导致执行报错触发反复重试:
import schedule import time
- 如果你是在Jupyter类的notebook环境中运行,底部的while True循环会一直占用内核线程,属于调度器的正常工作状态,只要没有反复打印main函数中的日志,就不属于异常持续执行。
修正后参考代码
import schedule import time # 此处省略你自己定义的ConnectSnow、SnowZips、ConnectSalesforce、SFZips、MergeZips函数 # 注意提前声明passwordSNOW、sqlzipterry、passwordSF、sf_data等全局变量 # 若任务执行时间较长,可加运行锁避免同一时间跑多个main实例 is_running = False def main(): global is_running if is_running: return is_running = True try: print("Lets connect to Snowflake...") SnowDB = ConnectSnow('email.com', passwordSNOW) print("Reading Snowflake statement") DFsnow = SnowZips(sqlzipterry) print("Lets connect to Salesforce...") SFDB = ConnectSalesforce('email.com', passwordSF) print("Reading Salesforce statement") df2 = SFZips(sf_data) # 修正变量名错误 Final = MergeZips(df2, DFsnow) finally: is_running = False schedule.every().day.at("16:30").do(main) # 注释掉每分钟执行的规则 # schedule.every(1).minutes.do(main) # 该循环为schedule标准逻辑,用于持续检查触发时间,不会导致任务异常重复执行 while True: schedule.run_pending() time.sleep(1)
内容的提问来源于stack exchange,提问作者aero8991
相关产品推荐
相关产品推荐

