2014-09-13 26 views
5

Bu Kereviz görev var:Bir Kereviz görevini tamam olarak işaretleme ve sonucunu ayarlama nasıl yapılır?

@app.task 
def do_something(with_this): 

    # instantiate a class from a third party library 
    instance = SomeClass() 

    # this class uses callbacks to send progress info about 
    # the status and progress of what we're doing 
    def progress_callback(data): 
     # this status will change to 'finished' later 
     # but the return value that I want as the task result won't be returned 
     # so this is where I should mark the task as done manually 
     if data['status'] == 'working': 
      # I create a custom state for this task 
      do_something.update_state(
       state = 'PROGRESS', 
       meta = data['progress'] 
      ) 

    # adding the callback to the instance 
    instance.add_callback(progress_callback) 

    # use the instance to do what I want 
    # this functions returns a value that I don't want as the task result 
    # so leaving this function without a return statement will make it None 
    instance.do_job(with_this) 

manuel olarak nasıl yapıldığı gibi bir görevi işaretleyebilirsiniz ? Ben olsun task.resultNone yani fonksiyon herhangi return deyimi olmadan sonuna geldiğinde bu durumda

, ben sonuç olarak geri arama işlevine aktarılan verileri ayarlamak ve tamamlandı olarak görev işaretlemek istiyorum.

app.backend.mark_as_done(do_something.request.id, data) 

başarıyla devlet ve görevin sonucunu ayarlıyor ama daha sonra sonuç burada None olan işlevin dönüş değeri olarak ayarlanır:

kullanıyorum çalıştı.

cevap

5

Sonunda örneğin görev durumunu saklamak ve neden sonra bir Ignore istisna yükselterek görev görmezden çözüm buldular: Eğer istediğiniz verileri geri dönemezsiniz zaman

from celery.exceptions import Ignore 

@app.task 
def do_something(with_this): 

    # store the state and result manually 
    # the SUCCESS state is set by this method 
    app.backend.mark_as_done(
     do_something.request.id, 
     the_data_to_store 
    ) 

    # we can also use update_state which calls 
    # backend.store_result just like mark_as_done 
    # but we have to set the state in this case 
    do_something.update_state(
     state = celery.states.SUCCESS, 
     meta = the_data_to_store 
    ) 

    # ignore the task so no other state is recorded 
    # like what was happening with my function in the question 
    # the task will still be acknowledged 
    raise Ignore() 

Faydalıydı sonuç olarak saklayın.

İlgili konular