Ho aggiunto la pianificazione a un modulo __init__
in una delle mie applicazioni di progetto (in termini di Django), ma avvolto con una piccola funzione che impedisce l'accodamento di due o più processi. La strategia di pianificazione può dipendere dalle vostre esigenze specifiche (ad esempio, potrebbe essere necessario un controllo aggiuntivo per gli argomenti di un lavoro).
codice che funziona per me e adatta alle mie esigenze:
import django_rq
from collections import defaultdict
import tasks
scheduler = django_rq.get_scheduler('default')
jobs = scheduler.get_jobs()
functions = defaultdict(lambda: list())
map(lambda x: functions[x.func].append(x.meta.get('interval')), jobs)
now = datetime.datetime.now()
def schedule_once(func, interval):
"""
Schedule job once or reschedule when interval changes
"""
if not func in functions or not interval in functions[func]\
or len(functions[func])>1:
# clear all scheduled jobs for this function
map(scheduler.cancel, filter(lambda x: x.func==func, jobs))
# schedule with new interval
scheduler.schedule(now+datetime.timedelta(seconds=interval), func,
interval=interval)
schedule_once(tasks.some_task_a, interval=60*5)
schedule_once(tasks.some_task_b, interval=120)
Inoltre ho avvolto questo frammento di evitare importazioni a livello di pacchetto:
def init_scheduler():
# paste here initialization code
init_scheduler()
Penso - da nessuna parte. Ogni volta che si riavvia il server delle applicazioni, i lavori verranno aggiunti alla coda del programma di pianificazione (le attività verranno moltiplicate per ogni avvio). Per risolvere il problema, è possibile cancellare/rimuovere la chiave 'rq: scheduler: scheduled_jobs' su ogni avvio, prima di aggiungerli. Ma ricorda di evitare di aggiungere/rimuovere lavori nei processi di lavoro - Non ho idea di come ottenerlo. – marcinn