簡體   English   中英

APScheduler 如何立即觸發作業

[英]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())

另請參閱類Job的實際實現

作為一種解決方法,我已經使用以下方法完成了。 總之,我循環遍歷所有作業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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM