我有一個長時間運行的進程,必須每五分鐘運行一次,但多個進程的實例不應該同時運行。這個過程通常不會超過五分鐘,但我想確保如果第二個實例運行結束,它不會啓動。Django Celery:只執行長時間運行的進程的一個實例
根據previous recommendation,我使用Django Celery來安排這個長期運行的任務。
我不認爲定期任務會起作用,因爲如果我有五分鐘的時間,如果任務的另一個實例已經運行,我不希望執行第二個任務。
我目前的實驗如下:在8點55分,任務的一個實例開始運行。當任務完成時,它會觸發另一個自己的實例在接下來的五分鐘運行。所以如果第一項任務在8點57分完成,第二項任務將在9點運行。如果第一個任務長時間運行並在9:01完成,它會安排下一個實例在9:05運行。
在做任何事情比以下簡單的例子,我一直在努力與各種神祕的錯誤,我還沒有發現任何其他人從以前的實例本身調度任務的例子。我想知道是否有更好的方法來做我想做的事情。我知道有一種方法來命名一個人的任務;也許有一種方法可以搜索具有相同名稱的運行或計劃實例?有沒有人有任何建議提供有關每五分鐘運行一次任務,但確保一次只運行一項任務?
謝謝 喬
在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])
謝謝0x00mh。這是一個乾淨的鏈接。我試試看。 – 2012-01-19 16:19:22