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, Joeteş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])
Teşekkürler 0x00mh. Bu temiz bir bağlantı. Deniyorum. –