繁体   English   中英

即使主要任务失败,也要运行和弦回调

Run a chord callback even if the main tasks fail

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

即使主要任务失败,是否可以运行和弦回调?

我创建了一个和弦,我添加了一堆任务并注册了一个回调。 我的问题是,如果其中一个任务失败,则不会触发回调,但我希望以任一方式触发回调。

我试图用si()注册回调( 不变性

callback = tasks.run_delete_rule.si([timestamp])
header = [tasks.run_update_rule.s(i, timestamp) for i in item_ids]
result = chord(header)(callback)

我还尝试将param ignore_result=True添加到两个任务装饰器中,但没有成功。

2 个回复

从github问题#1881,如果回调设置了link_error选项,它接受任务名称列表,那么当和弦的任务失败时,将执行link_error任务。

@task(name='super_task.good')
def good():
    return True

@task(name='super_task.raise_exception')
def raise_exception():
    raise ValueError('error')

@task(name='super_task.callback')
def callback(*args, **kwargs):
    logger.info('callback')
    logger.info(args)
    logger.info(kwargs)
    return 'finished'

@task(name='super_task.error_callback')
def error_callback(*args, **kwargs):
    logger.info('error_callback')
    logger.info(args)
    logger.info(kwargs)
    return 'error'

>>> c = chord(
        [raise_exception.s(), good.s(), raise_exception.s()], 
        callback.s().set(link_error=['super_task.error_callback'])
    )
>>> result = c()

这将执行和弦,在你的芹菜日志中,你会看到raise_exception任务失败,并且执行error_callback将在其中接收callback的task_id。

此时result的值将包含callbackAsyncResult实例,并且因为在和弦中错误传播到执行result.get()的回调将引发任务的异常并且result.traceback为您提供回溯。

如果你想要一个回调,只需将和弦回调的名称传递给link_error

callback.s().set(link_error='super_task.callback')

注意

另一个选项是设置CELERY_CHORD_PROPAGATES = False ,它将恢复到芹菜前的行为并始终执行回调。

但这不是推荐的方法,因为你可以在github问题#1349中找到

Celery 3.1定义了和弦错误的处理方式,之前的行为从未被记录过,更多的是因为从未打算以这种方式工作。

我们无法更改错误修正版本中的行为,因此必须使用设置,但从来没有意图有人故意禁用新行为。

新行为可以防止发生此类问题,并且可以删除向后兼容设置。 我建议你在这里找到一些其他方法来处理错误(如果你能为它发明一个好的api,我不介意提议)

您只需要改变调用link_error方式。 而不是字符串引用,传递带有您想要的参数的签名。

在上面的示例中,您可以传递参数如下

c = chord(
    [raise_exception.s(), good.s(), raise_exception.s()], 
    callback.s().set(link_error=[error_callback.s(<arguments_here>)])
)

请记住,第一个参数将是task_id ,进一步的参数将是签名中定义的参数。

1 findbugs gradle中的主要任务失败

我正在尝试在Gradle 1.10中运行findbugsMain任务(或更具体的“ gradlew检查”),但是我得到的唯一是错误信息,例如 似乎可以下载所需的jar: 我再次使用--stacktravce跑任务,这是我得到了什么: 引擎收录链接我的build.gradle也对引 ...

2 vba:选择行失败,复制行是主要任务

我无法通过简单的任务将一行复制到另一张偏移为一列的工作表中。 一个简单的 失败,因为大小不匹配。 我假设整个行都被选中 如果我仅选择测试所需的零件 我得到错误选择无法完成,错误1004。 我只想将A1:C1复制到B1:D1。 ...

3 如何启用两个功能以隐藏彼此的主要任务以及运行分配给他们的自己的主要任务?

我有两个函数showABC()和showXYZ()分别分配给两个不同的按钮“按钮1”和“按钮2”。 我希望“按钮1”显示文本“ ABC”,并且希望“按钮2”显示文本“ XYZ”,然后在单击“第二个按钮”时隐藏已经显示的文本“ ABC”,反之亦然时间。 希望你明白我的意思。 我尝试了以下 ...

4 主要任务中的Ansible子任务

我想在一个主要任务中有2个“子任务”,但是由于某种原因,我遇到了语法错误。 在我的/etc/ansible目录中,我必须具有以下结构: 在create_admin.yml文件中,我具有以下内容: 并在update_root.yml : 然后,我将这些任务包含在mai ...

2017-03-20 15:03:54 1 5512   ansible
5 从EDT派遣任务到主要任务?

我一直在阅读有关并发的内容(这让我很头疼)。 我知道你可以设置一个任务,使用以下命令从主线程在EDT上运行: 但你可以设置一个任务在EDT的主线程上运行吗? 如: 可以吗? 这是个坏主意吗? 与这个( 此处 )类似的另一个问题是关于创建新线程的问题,但是如果我 ...

6 是否可以节流主要任务而不是子任务

是否可以在jenkins管道作业中使用节流-并发-构建-插件,使该作业本身限于每个节点2个构建,而在测试阶段不执行并行任务? 为了阐明一个简短的示例: 限制主要工作以避免死锁并提高性能。 不应限制子任务,因此作业可以使用所有可用的执行程序。 ...

7 LLVM后端的主要任务是什么

我试图以一种简短而不是过于简化的形式为自己解释和总结LLVM后端中到底发生了什么-主要是检查我是否理解了正确的概念。 我觉得主要任务是选择适当的“真实”机器指令并替换通用的LLVM IR指令。 为此,后端实现包含有关寄存器和指令的所有相关信息。 通行证就像他们在做选择一样,是劳作。 正如LLVM后 ...

2021-01-01 19:07:14 0 25   llvm
8 仅取消 asyncio 程序中的主要任务

通常,如果使用asyncio.run(coroutine)函数启动asyncio.run(coroutine) ,则键盘中断 (CTRL + C) 或 SIGINT 将取消事件循环上的所有挂起任务。 我正在寻找一种只取消主要任务(传递给asyncio.run(coroutine) )的方法。 这个想 ...

9 如何确保使用失败的子任务调用Celery和弦回调?

我在Celery中使用Chord来获得一个并行任务完成执行时调用的回调。 具体来说,我有一组函数来包装对外部API的调用。 在处理结果并在Chord回调中更新我的数据库之前,我想等待所有这些返回。 我希望在所有API调用完成后执行回调,无论其状态如何。 我的问题是,如果组的子任务都没 ...

10 Toloka项目的限定任务和主要任务

我的资格赛任务可以是 SBS,主要任务是 Toloka 项目的策展吗? 技能与预选赛任务有何关联? 我可以将在一个项目中创建的新技能用于其他项目吗? ...

2021-07-29 15:16:49 1 7   toloka
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM