2017-06-18 67 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)