私はdjango_rq
とrq-scheduler
をオフラインタスクに使用したいと思いますが、私はrq-scheduler
のどこに繰り返しタスクをスケジューリングするかは分かりません。今、自分のアプリケーション内のtasks.py
モジュールにスケジューリングを追加し、それを__init__
.pyにインポートします。しかし、これを行うにはよりよい方法が必要です。djangoアプリケーションでrq-schedulerジョブをどこに登録しますか?
ありがとうございます。
私はdjango_rq
とrq-scheduler
をオフラインタスクに使用したいと思いますが、私はrq-scheduler
のどこに繰り返しタスクをスケジューリングするかは分かりません。今、自分のアプリケーション内のtasks.py
モジュールにスケジューリングを追加し、それを__init__
.pyにインポートします。しかし、これを行うにはよりよい方法が必要です。djangoアプリケーションでrq-schedulerジョブをどこに登録しますか?
ありがとうございます。
私のプロジェクトアプリケーション(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()
私はちょうど 'settings.pyのスケジューリング'です。インポートされるたびに、スケジュールされたジョブが再追加されます。 1時間に1回、一度に50のキューに積み重ねる仕事があった...;) –
私が見つけた最高の場所をそれを実行するにはAppConfig
のapps.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)
フォーマットを修正できますか? thnx – FeedTheWeb
django rqがこのスケジューラを検出する方法は?関数を呼び出すことによってどこかのコードからそれを開始する必要がありますか?どうすればpython manage.py rqschedulerを実行して自動的に起動することができますか? –
Djangoの新しいバージョンでは、アプリケーションの設定に使用したapps.pyファイルを作成できます。最新情報については、こちらを参照してください。https://docs.djangoproject.com/en/1.9/ref/applications/ –
私はdjango_rq
に含まrqscheduler
コマンドを変更し、置き換えるカスタム管理コマンドを作成しました。例を以下に示します。https://github.com/rq/rq-scheduler/issues/51#issuecomment-362352497
私は思っていません。アプリケーションサーバーを再起動するたびに、スケジューラーキューにジョブが追加されます(タスクは起動時に掛け算されます)。回避策として、各起動時に追加する直前に 'rq:scheduler:scheduled_jobs'キーをクリア/削除することができます。しかし、ワーカープロセスでジョブを追加/削除することは避けてください。これを達成する方法はわかりません。 – marcinn