2012-01-17 30 views
8

Her beş dakikada bir çalışması gereken uzun süreli bir işlem var, ancak işlemlerin birden çok örneği hiçbir zaman aynı anda çalıştırılmamalıdır. Süreç normal olarak beş dakika geçmemelidir, ancak ikinci bir örneğin devam ederse başlamayacağından emin olmak istiyorum.Django Kereviz: Uzun süren bir işlemin yalnızca bir örneğini yürütme

previous recommendation uyarınca, bu uzun süren görevi zamanlamak için Django Kereviz kullanıyorum.

Periyodik bir görevin çalışacağını sanmıyorum çünkü beş dakikalık bir sürem varsa, başka bir görev örneğinin çalışıp çalışmadığını ikinci bir görev yürütmek istemiyorum.

Şu anki denemem şu şekildedir: 8:55 de, görevin bir örneği çalışmaya başlar. Görev bittiğinde, sonraki beş dakika işaretinde çalışacak başka bir örneğini tetikler. Yani ilk görev 8:57 de bittiyse, ikinci görev saat 9: 00'da çalışırdı. İlk görev uzun sürecek ve 9:01'de bitecek olursa, sonraki örneği 9: 05'te çalışacak şekilde programlayacaktı.

Aşağıdaki basit örnekten başka bir şey yaparken, çeşitli şifreli hatalarla boğuşuyordum ve daha önceki bir görev örneğinden görevler planlayan başka örnekler bulamadım. Yapmaya çalıştığım şeyi yapmak için belki daha iyi bir yaklaşım olup olmadığını merak ediyorum. Birinin görevlerini tanımlamanın bir yolu olduğunu biliyorum; Belki de aynı adla çalışan veya planlanmış örnekleri aramanın bir yolu var mı? Her beş dakikada bir görev yapmakla ilgili tavsiyede bulunacak herhangi bir tavsiye var mı, ancak her seferinde yalnızca bir görevin yürütülmesini sağlıyor mu?

MyModule/tasks.py olarak, Joe

teşekkür ederiz: Bir ./manage.py kabuk itibaren

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) 

:

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

cevap

7

kullanabilirsiniz periyodik görevler, görevlerin tek seferde yürütülmesini sağlayan özel bir kilitle eşleştirilir. Bunlardan birinde başarısızlık varsa olacak görevlerin yürütülmesini durdurabilir önceki yürütme zamanlama görev ile

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

Sizin açıklanan yöntem: Burada Kereviz belgelerinden örnek uygulamasıdır.

+0

Teşekkürler 0x00mh. Bu temiz bir bağlantı. Deniyorum. –

İlgili konular