2016-09-25 11 views
0

ランダムな時間にいくつかのセロリのタスクを実行する必要があります。私は過去に何をしたか
は次のとおりです。
ランダムな時間にセロリのタスクを実行する

"my_task": { 
    "task": "path.to.my_task", 
    "schedule": crontab(minute='*/%s' % rand), 
}, 
rand = random(1,12) 

が、私のニーズはより多くのアヌのために、このコードは良くありません。
1.私は、各テナント
2用random0数と可能な限り(異なる必要があります。異なる番号がTHISの回答で説明したが、それは動作しませんでしたように私はスケジュールを上書きしようとした、より良い方法があるたびに発生していないだけでsettings.py負荷に(1回)

だろう?私は何かが足りないのですか?

(テナントAで例えばタスクが23で実行され、8時の翌日、及びテナントにタスクB 4で実行され、20などでは翌日)

ありがとう!

========更新====

私が得た素晴らしい答えた後、私はsuggested-
としての私の仕事とapply_asynch方法でそれを処理するためのオプションを追加しました。

"my-task": { # deprecated task 
       "task": "mdm_sync.tasks.test_task", 
       # "schedule": new_sc(), 
       "schedule": crontab(minute=39, hour=11), 
       "options": { 
        "eta": datetime.utcnow() 
       } 
}, 


entry.options["eta"] = datetime.datetime.utcnow() + datetime.timedelta(seconds=random(3600,12*3600) 

素晴らしい作品!

答えて

1

私は私は当初、私もrandom機能を使用して、あなたと同じようにやっていたランダムユーザーの時間のランダムな間隔で

間の通知のようFacebookのを生成するために持っていた中で、同様の問題に直面しましたminuteの値をcrontabに設定します。しかし、あなたがpython manage.py runserverを打ったときsettings.pycelery.pyとしてランダム関数は、ランダムな値が一度だけ選択されていることを一度だけ、ひいては走る、5分または7分言うことを、一度だけロードされますが、その後、このランダムな値が使用されタスクを5分または7分おきに繰り返すので、タスクは定期的にと繰り返されます。

だから、何をする必要がある代わりにsettings.pyにタスクのタイミングを定義するか、celery.pyのあなたは再帰的に必要があるということですあなたtasks.py内の関数/メソッドを呼び出します。しかし、ここで重要なのは、あなたが再帰的および非同期同じ関数を呼び出す必要があるということです、そして非同期的に呼び出している間、あなたはパラメータ遅延値が

ランダム関数を用いて算出されますを渡す必要があります>https://github.com/ankushrgv/notification/blob/master/apps/notifications/tasks.py

そして

celery.py - - >https://github.com/ankushrgv/notification/blob/master/config/celery.py

tasks.pyを参照してください。 210

python manage.py shellにしてから、その関数/メソッドを1回だけ呼び出すと、再帰を開始できます。

何か私の場合は

`myFunction().apply_async()` 

ようにそれは私があなたのソリューションとの質問を編集し

`CreateNotifications().apply_async()` 
+0

にするために使用しました。ありがとう! – amichib

+0

お寄せいただきありがとうございます。 :) –

関連する問題