Dodałem harmonogram do modułu __init__
w jednej z moich aplikacji projektowych (pod względem Django), ale zawijam z małą funkcją, która uniemożliwia kolejkowanie zadań dwa lub więcej razy. Strategia planowania może być zależna od Twoich konkretnych potrzeb (np. Możesz potrzebować dodatkowego sprawdzania argumentów zadania).
kod, który działa dla mnie i pasuje do moich potrzeb:
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)
Również mam owinięty ten fragment, aby uniknąć importu na poziomie pakietu:
def init_scheduler():
# paste here initialization code
init_scheduler()
Myślę - nigdzie. Za każdym razem, gdy restartujesz serwer aplikacji, zadania będą dodawane do kolejki programu planującego (zadania będą mnożone przy każdym uruchomieniu). Aby obejść ten problem, usuń/usuń klucz 'rq: scheduler: scheduled_jobs' przy każdym starcie, tuż przed ich dodaniem. Ale pamiętaj, aby unikać dodawania/usuwania zadań w procesach roboczych - nie mam pojęcia, jak to osiągnąć. – marcinn