第一个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_task
或chain
s的内容吗?
谢谢!