如何从内部任务取消芹菜链(request.chain,request.callbacks缺失)

时间:2017-08-17 18:11:26

标签: python django task celery

第一个S / O问题! 我知道其他一些S / O线程已经部分涵盖了这一点,但到目前为止我还没有找到基于相关问题的工作解决方案。

我有一个芹菜链,我这样打电话:

        result = chain(do_one_search.s(user_id) |
                       do_another_search.s() |
                       and_now_score.s() |
                       and_another_task.s() |
                       order_product.s()).apply_async(expires=10, retry=True)

每个任务的设置如下:

@shared_task(bind=True, max_retries=3)
def do_one_search(self, user_id):
    user = User.objects.get(user_id=user_id)
    user.do_one_search_worker_id = current_task.request.id
    user.save()
    if user.passes_a_check:
        some_util = SomeUtil()
        result = some_util.search_util(user_id)

        if user.fails_a_check_after_util_runs:
            revoke(current_task.request.id, terminate=True) # this doesn't work
            self.request.chain = self.request.callbacks = None # this doesn't work
        else:
            return guid
    else:
        self.request.chain = self.request.callbacks = None # yup, doesn't work.

所以revoke无效 - 无论如何,链中的下一个任务都会运行。 将self.request.chain/callbacks设置为None也无效。我无法访问链中的任何内容或self.request对象上的回调 - 它们都返回空。我认为这可能是Celery版本语法问题,并尝试self.request.chain[:] = []并抛出错误(NoneType)。

我还在fails_a_check_after_util_runs块中引发了一个例外,以确保可以通过current_task访问任务ID - 它是。

我认为可能是results被禁用但是尝试从这些工作者ID中获取AsyncResult对象的工作正常(它们总是PROCESSING),我认为会如果results被禁用,则情况并非如此。

我不是芹菜专家所以我在这里很难过......任何比我更了解的人的想法?我错过了关于shared_taskchain s的内容吗? 谢谢!

0 个答案:

没有答案