from apscheduler.schedulers.blocking import BlockingScheduler import datetime from apscheduler.events import EVENT_JOB_ERROR, EVENT_JOB_EXECUTED def test_1(a, b): print(a, b) def test_2(a, b): print('*'*16) print(a) c = 0 # 修改c的值,結束異常 if datetime.datetime(2020, 5, 26, 17, 19, 30) < datetime.datetime.now(): c = 1 print(b/c) def job_listener(Event): job = sched.get_job(Event.job_id) args = job.args # 正常結束任務 if not Event.exception: # 恢復原先的任務定時時間 sched.reschedule_job(Event.job_id, trigger='cron', hour='00', minute='10', second='00') print('*'*20,'成功', '*'*20) for job in sched.get_jobs(): print(job.name) print(job.trigger) else: # 計算當前時間5秒后的時間 next_datetime = datetime.datetime.now() + datetime.timedelta(seconds=5) # 修改出現異常的任務的定時,重新計算下次執行時間,本例為5秒后 sched.reschedule_job(Event.job_id, trigger='cron', hour=next_datetime.hour, minute=next_datetime.minute, second=next_datetime.second) msg = f"jobname={job.name}|jobtrigger={job.trigger}|errcode={Event.code}|exception=[{Event.exception}]|traceback=[{Event.traceback}]|scheduled_time={Event.scheduled_run_time}" if __name__ == "__main__": service = 1 seach_date_list = 2 job_defaults = { 'coalesce': True, # 允許合並任務 'max_instances': 3 } # 創建定時任務實例 sched = BlockingScheduler() sched.configure(job_defaults=job_defaults) # 添加任務1 sched.add_job(test_1,args=(service, seach_date_list,), trigger='cron', hour='14', minute='37', second='00', id="out_warehouse_order") # 添加任務2 sched.add_job(test_2,args=(service, seach_date_list,), trigger='cron', hour='17', minute='19', second='00', id='sale_after') # 創建監聽,任務出錯和任務正常結束都會執行job_listener函數 sched.add_listener(job_listener, EVENT_JOB_ERROR | \ EVENT_JOB_EXECUTED) # 開始定時任務 sched.start()