2013-07-08 30 views
8

我想使用django_rqrq-scheduler進行離線任務,但我不確定在哪裏調用rq-scheduler的計劃重複任務的能力。現在,我已將我的日程安排添加到我的應用中的tasks.py模塊,並將其導入到__init__ .py中。但是,必須有更好的方式來做到這一點,對嗎?我在哪裏可以在Django應用程序中註冊rq-scheduler作業?

在此先感謝。

+0

我想 - 無處。每次重新啓動應用程序服務器時,作業都將被添加到調度程序隊列中(任務在每次啓動時都會相乘)。作爲解決方法,您可以在每次啓動時清除/刪除'rq:scheduler:scheduled_jobs'鍵,然後再添加它們。但請記住,要避免在工作流程中添加/刪除作業 - 我不知道如何實現這一點。 – marcinn

回答

9

我已經在我的一個項目應用程序(根據Django)中添加了調度到__init__模塊,但是包含了防止排隊作業兩次或多次的小函數。調度策略可能取決於您的特定需求(即您可能需要額外檢查工作參數)。這對我的作品和適合我的需要

代碼:

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) 

而且我裹這個片段,以避免在封裝級進口:

def init_scheduler(): 
    # paste here initialization code 

init_scheduler() 
+3

我剛剛遇到了'在settings.py中調度'的地獄。顯然,每次導入時,它都會重新添加預定作業。我有一次每小時應該開火一次的工作,一次堆放在隊列50中......;) –

8

我發現的最好的地方運行它是從AppConfigapps.py

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

你能修改格式嗎? thnx – FeedTheWeb

+1

django rq如何檢測此調度程序?是否需要通過調用函數從某個代碼啓動它?或者如果不是,我怎麼能啓動它自動運行python manage.py rqscheduler? –

+0

在較新版本的Django中,您可以創建一個用於配置應用程序的apps.py文件。請參閱此處獲取最新信息:https://docs.djangoproject.com/en/1.9/ref/applications/ –

相關問題