2012-01-17 17 views
8

のインスタンスを1つだけ実行します。このプロセスは通常5分を超えて実行されるべきではありませんが、2番目のインスタンスが実行された場合、2番目のインスタンスが起動しないようにしたいと思います。ジャンゴセロリ:私は5分ごとに実行する必要があります長時間実行プロセスを持っていますが、プロセスの複数のインスタンスを同時に実行することはありません長時間実行プロセス

previous recommendationあたり、私はDjango Celeryを使用してこの長期実行タスクをスケジュールしています。

私は5分の期間を持っている場合、私はタスクの別のインスタンスがすでに実行されている場合に実行する2番目のタスクをしたくないので、私は、定期的なタスクが動作するとは思いません。

私の現在の実験は次の通りです:8:55に、タスクのインスタンスが実行を開始します。タスクが終了すると、次の5分に自分自身の別のインスタンスが実行されます。したがって、最初のタスクが8:57で終了した場合、2番目のタスクは9:00に実行されます。最初のタスクが長く実行され、9時01分に終了した場合、次のインスタンスが9時05分に実行されるようにスケジュールされます。

以下の簡単な例よりも何もしていたとき、私は不可解なエラーの様々な苦労してきたと私は自分自身の以前のインスタンスからタスクをスケジュールする人の他の例は見つかっていません。私がやろうとしていることをやるより良いアプローチがあるのだろうかと思っています。私は自分の仕事に名前を付ける方法があることを知っています。同じ名前の実行インスタンスまたはスケジュールされたインスタンスを検索する方法がありますか?誰かが5分ごとにタスクを実行することについて提供するアドバイスを持っていますが、一度に1つのタスクしか実行しないようにしていますか?

はのmymodule/tasks.pyで

、 ジョー

ありがとう:

import datetime 
from celery.decorators import task 

@task 
def test(run_periodically, frequency): 

    run_long_process() 
    now = datetime.datetime.now() 
    # Run this task every x minutes, where x is an integer specified by frequency 
    eta = (
     now - datetime.timedelta(
     minutes = now.minute % frequency , seconds = now.second, 
     microseconds = now.microsecond)) + datetime.timedelta(minutes=frequency) 
    task = test.apply_async(args=[run_periodically, frequency,], eta=eta) 

./manage.pyシェルから:あなたが使用することができます

from mymodule import tasks 
result = tasks.test.apply_async(args=[True, 5]) 

答えて

7

タスクが一度に1つずつ実行されることを保証する特別なロックと対になる定期的なタスク。ここではセロリのドキュメントからのサンプル実装です:

http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

それらのいずれかに故障が存在することになる場合は、前の実行からのスケジューリングタスクを使用して説明した方法は、タスクの実行を停止することができます。

+0

ありがとう0x00mh。それは素敵なリンクです。私はそれを試してみます。 –

関連する問題