10

5 分ごとに実行されるタスクが必要ですが、最後の実行が終了するのを待ってから、この 5 分のカウントを開始します。(この方法で、実行中のタスクが 1 つだけであることも確認できます) 私が見つけた最も簡単な方法は、django アプリケーションの manage.py シェルを実行して、これを実行することです。

while True:
    result = task.delay()
    result.wait()
    sleep(5)

しかし、この方法で実行したいタスクごとに、独自のシェルを実行する必要があります。簡単な方法はありますか? ジャンゴのセロリスケジューラーの王様のカスタムかもしれませんか?

4

6 に答える 6

18

うわー、この人の質問を誰も理解していないのは驚くべきことです。彼らはタスクを定期的に実行することについてではなく、Celery が同じタスクの 2 つのインスタンスを同時に実行しないようにする方法を尋ねています。Celery でこれを直接行う方法はないと思いますが、できることは、タスクの 1 つが開始時にロックを取得し、失敗した場合は数秒後に再試行することです (再試行を使用)。 . タスクは、戻る直前にロックを解放します。ロックがクラッシュしたりタイムアウトしたりした場合は、数分後にロックを自動期限切れにすることができます。

ロックには、おそらくデータベースまたはRedisのようなものを使用できます。

于 2013-07-12T00:23:22.813 に答える
16

セロリの conf を変更する必要がない、この単純な方法に興味があるかもしれません。

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def my_task():
    # Insert fun-stuff here
于 2011-04-27T04:56:26.513 に答える
12

必要なのは、定期的に実行したい celery conf witch タスクとその間隔を指定することだけです。

例: tasks.add タスクを 30 秒ごとに実行する

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
     },
}

-B オプションを使用してビートモードでセロリを実行する必要があることに注意してください

manage celeryd -B

時間間隔の代わりに crontab スタイルを使用することもできます。これを確認してください。

http://ask.github.com/celery/userguide/periodic-tasks.html

django-celery を使用している場合は、django db を定期的なタスクのスケジューラとして使用することもできます。このようにして、django-celery 管理パネルから新しい定期的なタスクを簡単に追加できます。そのためには、この方法で settings.py に celerybeat スケジューラーを設定する必要があります

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
于 2011-03-19T10:50:41.723 に答える
4

@MauroRoccoの投稿を拡張するには、http: //docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.htmlから

スケジュールにtimedeltaを使用すると、タスクはcelerybeatの開始から30秒後に実行され、最後の実行から30秒ごとに実行されます。crontabのようなスケジュールも存在します。Crontabスケジュールのセクションを参照してください。

したがって、これは確かにあなたが望む目標を達成します。

于 2011-03-19T16:18:55.150 に答える
0

そのタスクを別のキューに追加してから、同時実行オプションを 1 に設定して、そのキューに別のワーカーを使用します。

于 2016-02-15T11:32:29.093 に答える