[英]APScheduler how to trigger job now
我在 Flask 應用程序中有一個 APScheduler,以一定的時間間隔發送事件。
現在我需要“刷新”所有作業,實際上,如果它們在沒有觸及定義的時間間隔的情況下不運行,現在就開始它們。
我試過調用 job.pause() 然后調用 job.resume() 什么也沒有,並使用 job. reschedule_job(...) 會觸發它,但也會更改間隔...我不想要的。
我的實際代碼如下:
cron = GeventScheduler(daemon=True)
# Explicitly kick off the background thread
cron.start()
cron.add_job(_job_time, 'interval', seconds=5, id='_job_time')
cron.add_job(_job_forecast, 'interval', hours=1, id='_job_forecast_01')
@app.route("/refresh")
def refresh():
refreshed = []
for job in cron.get_jobs():
job.pause()
job.resume()
refreshed.append(job.id)
return json.dumps( {'number': len(cron.get_jobs()), 'list': refreshed} )
我不鼓勵按照接受的答案中的建議調用job.func()
。 調度程序不會意識到作業正在運行的事實,並且會擾亂常規的調度邏輯。
而是使用作業的modify()
函數將其next_run_time
屬性設置為now()
:
for job in scheduler.get_jobs():
job.modify(next_run_time=datetime.now())
作為一種解決方法,我已經使用以下方法完成了。 總之,我循環遍歷所有作業cron.get_jobs()
並使用作業對象創建一個一次性作業到“日期”觸發器,該觸發器僅在datetime.now
觸發一次,因為未指定。
def refresh():
refreshed = []
for job in cron.get_jobs():
cron.add_job(job.func, 'date', id='{0}.uniq'.format(job.id), max_instances=1)
refreshed.append(job.id)
return json.dumps( {'number': len(cron.get_jobs()), 'list': refreshed} )
答案很晚,但我認為您需要的是簡單地調用“刷新”路由中的方法。
您也可以直接運行作業功能。
for job in cron.get_jobs():
job.func()
如果您將 args 或 kwargs 傳遞給函數,則必須將它們從job.args
和/或job.kwargs
中提取出來。 參見apscheduler.job.Job
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.