2013-07-08 8 views
8

Chciałbym używać django_rq i rq-scheduler do zadań w trybie offline, ale nie jestem pewien, gdzie zadzwonić pod numer rq-scheduler, aby zaplanować powtarzanie zadań. W tej chwili dodałem harmonogram do modułu tasks.py w mojej aplikacji i zaimportuję go w __init__ .py. Ale musi być lepszy sposób, prawda?Gdzie mogę zarejestrować zadanie rq-scheduler w aplikacji Django?

Z góry dziękuję.

+0

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

Odpowiedz

9

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() 
+3

Po prostu wpadłem na piekło, które jest "planowaniem w settings.py". Podobno za każdym razem, gdy jest importowany, ponownie dodaje zaplanowane zadania. Miałem prace, które miały uruchamiać się raz na godzinę, układając się w kolejce 50 na raz ....;) –

8

najlepsze miejsce, w jakim znaleziono aby go uruchomić, należy to zrobić pod adresem AppConfig pod numerem .

def ready(self): 
    scheduler = django_rq.get_scheduler('default') 

    # Delete any existing jobs in the scheduler when the app starts up 
    for job in scheduler.get_jobs(): 
     job.delete() 

    # Have 'mytask' run every 5 minutes 
    scheduler.schedule(datetime.utcnow(), 'mytask', interval=60*5) 
+1

czy możesz naprawić formatowanie? thnx – FeedTheWeb

+1

W jaki sposób django rq wykryje ten harmonogram? czy konieczne jest zainicjowanie go z kodu gdzieś przez wywołanie funkcji? lub jeśli nie, w jaki sposób mogę zainicjować go automatycznie na uruchomieniu python manage.py rqscheduler? –

+0

W nowszych wersjach Django można utworzyć plik apps.py, który służy do konfiguracji aplikacji. Zobacz tutaj, aby uzyskać najnowsze informacje: https://docs.djangoproject.com/en/1.9/ref/applications/ –

Powiązane problemy