2012-01-17 67 views
8

我有一個長時間運行的進程,必須每五分鐘運行一次,但多個進程的實例不應該同時運行。這個過程通常不會超過五分鐘,但我想確保如果第二個實例運行結束,它不會啓動。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]) 

回答

相關問題