2015-08-26 2 views
5

J'ai un APScheduler dans une application Flask, envoyant des événements à certains intervalles.APScheduler comment déclencher le travail maintenant

Maintenant, j'ai besoin de "rafraîchir" tous les travaux, en fait juste de les commencer maintenant s'ils ne fonctionnent pas sans toucher à l'intervalle défini. Je ai essayé d'appeler job.pause() puis job.resume() et rien, et en utilisant le travail. reschedule_job (...) le déclencherait mais changerait aussi l'intervalle ... que je ne veux pas.

Mon code actuel est ci-dessous:

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}) 

Répondre

0

Vous pouvez également exécuter directement la fonction de travail.

for job in cron.get_jobs(): 
    job.func() 

Si vous aviez args ou kwargs être passé dans la fonction, vous auriez à tirer sur ceux job.args et/ou job.kwargs. Voir apscheduler.job.Job

0

Pour contourner ce problème, je l'ai fait en utilisant ce qui suit. En résumé, je parcourt tous les travaux cron.get_jobs() et crée un travail ponctuel en utilisant l'objet Tâche sur un déclencheur 'date', qui ne se déclenche qu'une fois, à datetime.now car non spécifié.

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}) 
+0

Aussi il ya déjà 2 ans, j'ai posté une nouvelle réponse qui rendra l'utilisateur des mécanismes de planification appropriés pour commencer un travail _now_. –

4

Je déconseille d'appeler job.func() comme proposé dans la réponse acceptée. Le planificateur ne serait pas mis au courant du fait que le travail est en cours d'exécution et gâchera avec la logique de planification régulière.

utiliser à la place modify() fonction de la tâche à définir sa propriété next_run_time à now():

for job in cron.get_jobs(): 
    job.modify(next_run_time=datetime.now()) 

Also refer to the actual implementation of class Job.