2017-06-18 45 views
1

我是芹菜新手。我有一個芹菜任務需要在條件滿足時執行。否則在幾分鐘後重試。從下面的代碼,我被困在如何重試在其他條件相同的任務?感謝你的幫助。如何有條件地執行芹菜任務python

@app.task(bind=True,soft_time_limit=4 * 3600) 
def task_message_queue(id, name=None, tid=None, src=None, dest=None, queue="MessageQueue"): 
    ThreadLocalStore().set_data({"id": id, "tid": tid, "name": name,"src": src, "dest":dest}) 
    num_files = os.popen("find %s -type f | wc -l" % dest).read().strip().split('\n')[0] 
    if num_files < 20: 
    #Move files from src to destination 
    else: 
    #wait for 2 minutes and retry the task 

回答

1

你必須調用retry使芹菜重試任務,你可以設置倒計時這樣芹菜會等待那麼長的時間,然後重試任務。以下是從官方celery docs借用的代碼。根據您的需要修改@task 裝飾也self.retry

from celery.task import task 
@app.task(bind=True,soft_time_limit=4 * 3600) 
def task_message_queue(self, id, name=None, tid=None, src=None, dest=None, queue="MessageQueue"): 
    ThreadLocalStore().set_data({"id": id, "tid": tid, "name": name,"src": src, "dest":dest}) 
    num_files = os.popen("find %s -type f | wc -l" % dest).read().strip().split('\n')[0] 
    try: 
     if num_files < 20: 
      #Move files from src to destination 
     else: 
      raise SOME_EXCEPTION 
      #wait for 2 minutes and retry the task 
    except SOME_EXCEPTION as exc: 
     self.retry(exc=exc, countdown=TIME_TO_WAIT_BEFORE_RETRY) 
+0

謝謝Arpit。所以,我在其他情況下加了一個「加註」。和異常內的self.retry。我會測試它。 – user2406718

+0

其實你不需要提升條件,如果其他工作在這裏 –

+0

如果我不提高異常,那麼「exc」沒有定義。即使當我引發異常時,我也有問題,因爲exc沒有得到執行的實際任務 – user2406718

2

而不是依靠重試,你也只是再次觸發任務。

from celery.task import task 
@app.task(bind=True,soft_time_limit=4 * 3600) 
def task_message_queue(self, id, name=None, tid=None, src=None, dest=None, queue="MessageQueue"): 
    ThreadLocalStore().set_data({"id": id, "tid": tid, "name": name,"src": src, "dest":dest}) 
    num_files = os.popen("find %s -type f | wc -l" % dest).read().strip().split('\n')[0] 

    if num_files < 20: 
     #Move files from src to destination 
    else: 
     # Trigger the task again in 120 seconds. 
     task_message_queue.apply_async(countdown=120)