2013-02-15 26 views
6

Kereviz 3.0'dan zincirler kullanılarak oluşturulan bir iş akışını duraklatmak/sürdürmek için herhangi bir yol var mı?Django Kereviz İş Akışı Zinciri Duraklat/Devam Et

Temel olarak, sistemimizde iki farklı türde görev vardır: etkileşimli ve etkileşimli olmayanlar. Etkileşimli olmayanlar için tüm parametrelere sahibiz, ancak etkileşimli olanlar kullanıcı girdisine ihtiyaç duyar. Etkileşimli görevler için, yalnızca zincirin önceki tüm taksitleri tamamlandıktan sonra kullanıcı girdisini isteyebiliriz çünkü sonuçları etkileşimli görevleri etkileyecektir (yani, gerçek zinciri oluşturmadan önce kullanıcı girdisini talep edemeyiz).

Buna nasıl yaklaşılacağına dair herhangi bir öneriniz var mı? Gerçekten burada bir kayıp ..

Güncel fikirler de:

  • (kereviz ithalat Görev itibaren) Görev iki alt sınıfını oluşturun. Varsayılan olarak false olarak ayarlanmış Etkileşimli görev alt sınıfına fazladan bir örnek (sınıf üyesi) değişkeni ekleyin ve bazı kullanıcı girişlerinin hala gerekli olduğunu gösterir. Her nasılsa, Görev örneğine erişebilir ve onu kereviz işçisinin dışından doğru olarak ayarlayabilirim (Buna biraz baktım ve Görev nesnelerine doğrudan başka bir modülden erişebilmek mümkün görünmüyor)
  • Zinciri Etkileşimli işler tarafından sınırlandırılmış çok sayıda zincir halinde bölümlere ayırın. Bir zincirin sonuna ulaştığında ve interaktif görevin etkileşimli istemci tarafı bileşenini tetiklediğinde, kereviz işçisinin dışında bir çeşit mekanizmanın bulunmasını sağlayın. Kullanıcı tüm bu verileri girdikten sonra, verileri alın ve interaktif görevin yeni zincirin başında olduğu yeni zinciri başlatın.

cevap

2

& projemizdeki ikinci fikriniz gibi bir şey uyguladık. İşte uygulamanın özü.

Modelinize status10 alanından yeni kayıt ekleme yöntemini ekleyin.

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

GeçişKullanıcının bilgi girmesi için UI elemanını görüntülemek için yararlı olan şablonadeğişken. Kullanıcı gerekli bilgileri girdiğinde durumu değiştirin. Bu, interactive_task'u tetikleyen custom_func'u çağırır.