2015-08-26 17 views
5

Bir Flask uygulamasında bir APScheduler var, bazı aralıklarla olaylar gönderiyor.APScheduler şimdi nasıl tetiklenir

Artık tüm işleri "yenilemem gerekiyor", aslında, yalnızca şimdi tanımlı aralıkta dokunmadan çalışmazlarsa.

job.pause() öğesinden sonra job.resume() ve hiçbir şey denemeyi ve işi kullanmayı denedim. reschedule_job (...) bunu tetikler ama aynı zamanda istemediğim aralığı da değiştirir.

Benim gerçek kod feryat geçerli:

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

cevap

0

Sadece iş işlevini de doğrudan çalıştırabilirsiniz. Eğer Args veya kwargs işleve verilmeden olsaydı

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

, sen job.args ve/veya job.kwargs At bu çekin gerekir. apscheduler.job.Job

0

Çözüm olarak ben aşağıdakileri kullanarak yaptık. Özetle, cron.get_jobs() tüm işlerde dolaşabilir ve belirtilmemişse, datetime.now adresinde yalnızca bir kez tetikleyen bir 'date' tetikleyicisine Job nesnesini kullanarak bir kerelik bir iş oluşturun.

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

Ayrıca 2 yıl önce, bir işi başlatmak için uygun zamanlama mekanizmalarını kullanıcı yapan yeni bir cevap yayınladım _now_. –

4

Kabul edilen yanıtta önerildiği şekilde job.func() numaralı telefonu aramadan vazgeçiyorum. Zamanlayıcı, işin çalıştığı gerçeğinin farkına varılmayacak ve normal zamanlama mantığına ters düşecektir.

yerine now() onun next_run_time özelliğini ayarlamak için işin modify() işlevini kullanın:

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

Also refer to the actual implementation of class Job.

İlgili konular