2010-12-02 15 views
11

मैं परीक्षण कैसे कर सकता हूं यदि कोई कार्य (task_id) अभी भी celery में संसाधित किया गया है? मैं इस परिदृश्य है:परीक्षण करें कि एक अजवाइन कार्य अभी भी संसाधित किया जा रहा है

  1. एक Django दृश्य
  2. स्टोर BaseAsyncResult सत्र
  3. शटडाउन अजवाइन डेमॉन (हार्ड) में में एक कार्य शुरू तो कार्य अब और संसाधित नहीं है
  4. जांच करें कि कार्य 'मृत'

कोई विचार? एक लुकअप सभी कार्य को अजवाइन द्वारा संसाधित किया जा सकता है और जांच सकता है कि मेरा अभी भी है या नहीं?

+1

अरे मैं भी इस के लिए कुछ इसी तरह रहा हूँ, तुमने किया था कभी हल करने के लिए चारों ओर मिलता है? मैं सोच रहा हूं कि task_id को django के कैश फ्रेमवर्क में स्टोर करना है या नहीं। मुझे पता है कि मैं कार्य की स्थिति प्राप्त करने के लिए इस http://dpaste.com/370419/ जैसे कुछ उपयोग कर सकता हूं। लेकिन task_id को स्टोर करने के लिए डेटाबेस, कैश का उपयोग करने के बीच उलझन में हूं। – Chantz

उत्तर

3

अजवाइन कार्य स्टोर करने के लिए अपने मॉडल में एक क्षेत्र (PickledObjectField) को परिभाषित:

class YourModel(models.Model): 
    . 
    . 
    celery_task = PickledObjectField() 
    . 
    . 

    def task(): 
     self.celery_task = SubmitTask.apply_async(args = self.task_detail()) 
     self.save() 

मामले में अपने कार्य को किसी भी मॉडल पर विशिष्ट नहीं है आप अजवाइन कार्यों के लिए विशेष रूप से एक बनाना चाहिए।

या तो मैं django-celery का उपयोग करने का सुझाव देता हूं। इसकी एक अच्छी निगरानी सुविधा है:
http://ask.github.com/celery/userguide/monitoring.html#django-admin-monitor, एक अच्छे ग्राफिकल तरीके से एक django मॉडल में कार्य विवरण बचाता है।

+0

हां, मैं django-celery का उपयोग करता हूं और राज्य प्राप्त करने के लिए आंतरिक टास्कमेटा मॉडल में लुकअप करता हूं। जवाब के लिए धन्यवाद। –

0

मुझे लगता है कि मॉडल में कार्य ऑब्जेक्ट को स्टोर करने से बेहतर तरीका है। उदाहरण के लिए, यदि आप अगर कार्य (समानांतर) के एक समूह पूरा कर लिया है की जाँच करना चाहता था:

# in the script you launch the task 
from celery import group 

job = group(
    task1.s(param1, param2), 
    task2.s(param3, param4) 
) 
result = job.apply_async() 
result.save() 

# save the result ID in your model 
your_obj_model = YourModel.objects.get(id='1234') 
your_obj_model.task_id = result.id 
your_obj_model.save() 

फिर अपने ध्यान में रखते हुए

from celery.result import GroupResult 
# ... 
task_result = GroupResult.restore(your_obj_model.task_id) 
task_finished = task_result.ready() 
# will be True or False