2013-07-08 14 views
8

私はdjango_rqrq-schedulerをオフラインタスクに使用したいと思いますが、私はrq-schedulerのどこに繰り返しタスクをスケジューリングするかは分かりません。今、自分のアプリケーション内のtasks.pyモジュールにスケジューリングを追加し、それを__init__ .pyにインポートします。しかし、これを行うにはよりよい方法が必要です。djangoアプリケーションでrq-schedulerジョブをどこに登録しますか?

ありがとうございます。

+0

私は思っていません。アプリケーションサーバーを再起動するたびに、スケジューラーキューにジョブが追加されます(タスクは起動時に掛け算されます)。回避策として、各起動時に追加する直前に 'rq:scheduler:scheduled_jobs'キーをクリア/削除することができます。しかし、ワーカープロセスでジョブを追加/削除することは避けてください。これを達成する方法はわかりません。 – marcinn

答えて

9

私のプロジェクトアプリケーション(Djangoに関して)の__init__モジュールにスケジューリングを追加しましたが、キューイングジョブが2回以上行われないように小さな関数でラップされています。スケジュール設定の戦略は、ニーズに応じて異なる場合があります(ジョブの引数を追加で確認する必要があります)。

私の作品と私のニーズに合うコード:

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のスケジューリング'です。インポートされるたびに、スケジュールされたジョブが再追加されます。 1時間に1回、一度に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/ –

関連する問題