如何在 python 调度模块完成之前清除待处理的作业?
How to clear the pending jobs before it finished in python schedule module?
实际上,我试过这个解决方案,。它按我的预期工作。
但是,我正在制作一个简单的育儿程序,它从 sqlite 数据库文件中获取时间。
.
时间到了,程序会显示通知。 5 分钟后,将显示另一个通知。第二次通知 30 秒后,程序将执行注销命令。
我的代码:
def job():
toaster.show_toast(Title, MsgOne, icon_path=Icon) # 1st notification
time.sleep(300) # Sleep for 5 mins
toaster.show_toast(Title, MsgTwo, icon_path=Icon) # 2nd notification
time.sleep(30) # Sleep for 30 sec
os.system("shutdown -l") # logout
schedule.every().day.at(TimeFajr).do(job) # Fajr
schedule.every().day.at(TimeDhuhr).do(job) # Dhuhr
schedule.every().day.at(TimeAsr).do(job) # Asr
schedule.every().day.at(TimeMaghrib).do(job) # Maghrib
schedule.every().day.at(TimeIshaa).do(job) # Isha'a
while True:
schedule.run_pending()
time.sleep(1)
一切正常。即使在将其转换为 exe (使用 auto-py-to-exe 模块) 之后也是如此。我通过将程序添加到 windows 启动文件夹使程序在后台运行。
问题是,当我将我的电脑置于睡眠模式或锁定我的电脑时在时间到达之前重新登录时间过去后,程序运行QUEUED JOB并注销系统,即使时间过去了。我想要的是,QUEUED JOB 需要被清除或不执行那个。我尝试了上面link的解决方案,但是我将其转换为exe后它不起作用。没有这个,程序工作正常。 (对不起,我的英文很弱!)
仅供参考,我是 python 的新手,这是我的第一个项目。如果还有其他方法可以实现我正在做的事情,请指导我。
更新:
我终于想出了一个方法来做到这一点。
我用 APScheduler
替换了整个 scheduler 模块
我的代码片段:
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
toaster.show_toast(Title, MsgOne, icon_path=Icon) # 1st notification
time.sleep(180) # Sleep for 3 mins
toaster.show_toast(Title, MsgTwo, icon_path=Icon) # 2nd notification
time.sleep(30) # Sleep for 30 sec
toaster.show_toast(Title, MsgThree, icon_path=Icon) # 3rd notification
#ctypes.windll.PowrProf.SetSuspendState(0, 1, 0) # This will put the PC on sleep
os.system("rundll32.exe user32.dll,LockWorkStation") # lock windows
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=fajr_H, minute=fajr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=dhuhr_H, minute=dhuhr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=asr_H, minute=asr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=maghrib_H, minute=maghrib_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=ishaa_H, minute=ishaa_M, misfire_grace_time=1)
scheduler.start()
这个如我所愿。
实际上,我试过这个解决方案,
但是,我正在制作一个简单的育儿程序,它从 sqlite 数据库文件中获取时间。
时间到了,程序会显示通知。 5 分钟后,将显示另一个通知。第二次通知 30 秒后,程序将执行注销命令。
我的代码:
def job():
toaster.show_toast(Title, MsgOne, icon_path=Icon) # 1st notification
time.sleep(300) # Sleep for 5 mins
toaster.show_toast(Title, MsgTwo, icon_path=Icon) # 2nd notification
time.sleep(30) # Sleep for 30 sec
os.system("shutdown -l") # logout
schedule.every().day.at(TimeFajr).do(job) # Fajr
schedule.every().day.at(TimeDhuhr).do(job) # Dhuhr
schedule.every().day.at(TimeAsr).do(job) # Asr
schedule.every().day.at(TimeMaghrib).do(job) # Maghrib
schedule.every().day.at(TimeIshaa).do(job) # Isha'a
while True:
schedule.run_pending()
time.sleep(1)
一切正常。即使在将其转换为 exe (使用 auto-py-to-exe 模块) 之后也是如此。我通过将程序添加到 windows 启动文件夹使程序在后台运行。
问题是,当我将我的电脑置于睡眠模式或锁定我的电脑时在时间到达之前重新登录时间过去后,程序运行QUEUED JOB并注销系统,即使时间过去了。我想要的是,QUEUED JOB 需要被清除或不执行那个。我尝试了上面link的解决方案,但是我将其转换为exe后它不起作用。没有这个,程序工作正常。 (对不起,我的英文很弱!)
仅供参考,我是 python 的新手,这是我的第一个项目。如果还有其他方法可以实现我正在做的事情,请指导我。
更新:
我终于想出了一个方法来做到这一点。 我用 APScheduler
替换了整个 scheduler 模块我的代码片段:
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
toaster.show_toast(Title, MsgOne, icon_path=Icon) # 1st notification
time.sleep(180) # Sleep for 3 mins
toaster.show_toast(Title, MsgTwo, icon_path=Icon) # 2nd notification
time.sleep(30) # Sleep for 30 sec
toaster.show_toast(Title, MsgThree, icon_path=Icon) # 3rd notification
#ctypes.windll.PowrProf.SetSuspendState(0, 1, 0) # This will put the PC on sleep
os.system("rundll32.exe user32.dll,LockWorkStation") # lock windows
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=fajr_H, minute=fajr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=dhuhr_H, minute=dhuhr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=asr_H, minute=asr_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=maghrib_H, minute=maghrib_M, misfire_grace_time=1)
scheduler.add_job(job, 'cron', day_of_week='mon-sun', hour=ishaa_H, minute=ishaa_M, misfire_grace_time=1)
scheduler.start()
这个如我所愿。