Celery:从任务中撤销整个链的干净方法

2023-11-25

我的问题可能非常基本,但我仍然无法在官方文档中找到解决方案。我在 Django 应用程序中定义了一个 Celery 链,执行一组相互依赖的任务:

chain(  tasks.apply_fetching_decision.s(x, y),
        tasks.retrieve_public_info.s(z, x, y),
        tasks.public_adapter.s())()

显然第二个和第三个任务需要父任务的输出,这就是我使用链的原因。

现在的问题是:我需要以编程方式revoke如果第一个任务中的测试条件失败,则执行第二个和第三个任务。如何以干净的方式做到这一点?我知道我可以从定义链的方法中撤销链的任务(请参阅this问题和this doc) but inside第一个任务我看不到后续任务或链本身。

临时解决方案

我目前的解决方案是skip后续任务中的计算基于前一个任务的结果:

@shared_task
def retrieve_public_info(result, x, y):
   if not result:
      return []
   ...

@shared_task
def public_adapter(result, z, x, y):
   for r in result:
       ...

但这个“解决方法”有一些缺陷:

  • 向每个任务添加不必要的逻辑(基于前一个任务的结果),从而影响重用
  • Still executes后续任务以及由此产生的所有开销

我没有过多地将链的引用传递给任务,以免搞砸事情。我也承认我没有尝试过抛出异常的方法,因为我认为选择不继续执行链可能是一种功能性(因此非例外)场景......

感谢您的帮助!


从 Celery 4.0 开始,我发现有效的方法是从当前的任务中删除剩余的任务任务实例的请求使用以下语句:

self.request.chain = None

假设您有一系列任务a.s() | b.s() | c.s()。您只能访问self任务中的变量,如果您绑定任务通过传递bind=True作为任务装饰器的参数。

@app.task(name='main.a', bind=True):
def a(self):
  if something_happened:
    self.request.chain = None

If something_happened是真实的,b and c不会被处决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery:从任务中撤销整个链的干净方法 的相关文章

随机推荐

  • Font Awesome 未出现在 Internet Explorer 8 中

    我们最近开发了一个网站 其设计强烈依赖 Font Awesome 我们使用 before content 及其提供的 CSS 的标准实现 由于某些原因 Font Awesome 未在 IE8 中显示 我花了相当多的时间进行故障排除并尝试各种
  • jQuery:如何在元素显示时调用函数

    我想在 div 显示时 显示后 调用一个函数 有谁知道我该怎么做 我尝试使用类似的东西 someDiv bind show function alert example 但我不确定我是否以正确的方式做到这一点 或者是否可能实现这一点 有任何
  • Java 可以在运行时创建变量吗?

    例如 假设我想 提取 String fruits Pear Banana Apple 分成三个独立的变量 例如 for int i 0 i fruits length i of course there s no eval in Java
  • 如何在 Java 中表示一个范围?

    假设一个整数应该在以下范围内 0 2147483647 我想检查整数变量是否落在这个范围内 我知道它可以通过一个简单的 if else 语句来完成 但是有没有更有效的方法来检查它是否在范围内 我宁愿不这样做 if foo gt 0 foo
  • 用于正确对齐列的 Shell 脚本

    我有一个 3 列 制表符分隔的文件 例如 activity log manager Manager reserve rm hreserver rm log manager Manager mo apprv mgr1 Approving Ma
  • keras.load_model() 无法识别 Tensorflow 的激活函数

    我使用保存了 tf keras 模型tf keras save model功能 为什么tf keras load model抛出异常 代码示例 import tensorflow as tf from tensorflow import k
  • 页面上存在一个或多个错误

    收到 页面上存在一个或多个错误 但无法找到确切的错误 这是截图 Edit 1 我正在尝试上传尺寸为 1536 x 2048 像素的 iPad 屏幕截图 以获取最大高分辨率肖像 全屏 并锁定 但出现奇怪的错误 如下所示 注意 我尝试从 chr
  • 从 HTML
    到 Microsoft Word

    我有一个 HTMLfigure img and figcaption标签 我想将它们转换为 Microsoft Word 文档 所引用的图像img应该插入到Word文档中 并且figcaption应转换为其标题 也保留图号 我尝试用 Wor
  • 如何使用公钥加密字符串并使用私钥解密?

    我想用服务器上的密钥加密密码并在服务器端解密加密的密码 这是我在我的应用程序中使用的代码 To change this license header choose License Headers in Project Properties
  • 增加android模拟器的内存容量?

    如何增加Android模拟器的内存容量 我有一个 16MB 的二进制文件 我必须解析它 但是当我第二次执行时它说 Installation error INSTALL FAILED INSUFFICIENT STORAGE 有人可以帮忙吗
  • 我怎样才能在vim中快速输入像“==========”这样的行

    我正在编辑重组文本文件 我经常需要在一行中放置一些字符 例如 并且我希望该行的长度与前一行匹配 我应该如何在 vim 中执行此操作 a long long title Thanks 另一个可行的方法 yypv r
  • C# FileStream:写入大文件的最佳缓冲区大小?

    假设我正在将几个文件写入磁盘 大小在 2MB 到 5GB 之间 FileStream 的合理缓冲区值是多少 使用几兆字节的缓冲区大小是否明智 或者我应该坚持使用千字节缓冲区 默认缓冲区大小为 4 KiB 另外 请看这里 NET 的顺序文件编
  • NSWidgetExtensionContext openURL Swift

    我一直在尝试实现一个按钮来从其小部件打开我的 iOS 应用程序 我意识到这个问题已经在论坛上被打败了 但我找不到我收到的具体错误的解释 也许你们中一些更有经验的 iOS 开发人员可以对此做出一些解释 我正在使用 XCode 8 1 和 Sw
  • 如何定义类型参数不能为 Any 的 scala 方法

    在下面的示例中 我想定义一个contains无法编译的方法a and b不属于同一基本类型 In contains1暗示 如果a is Seq Int b 是String T导出为Any 并且它可以编译 这不是我想要的 In contain
  • Vim:通过 ssh 访问系统剪贴板 - Linux 到 OS X

    我是 Linux 用户 经常需要通过 SSH 在远程 OS X 服务器上工作 我更喜欢 vim neovim 编辑器 但我在通过 SSH 向系统剪贴板复制 粘贴时遇到问题 当我尝试复制行时 yy它保存在远程 OS X 剪贴板上 有没有办法将
  • 为什么需要使用 docker 将“pam_loginuid”设置为其“可选”值?

    为了运行 ssh 守护进程服务 pam loginuid必须将 etc pam d sshd 中的条目设置为可选 如官方示例适用于 Ubuntu 13 10 对于以前版本的 Ubuntu 此条目是可选的吗 它在 Ubuntu 13 10 之
  • 行尾有“^M”字符

    当我在 Unix 环境中运行特定的 SQL 脚本时 我在 SQL 脚本的每一行末尾看到一个 M 字符 因为它回显到命令行 我不知道 SQL 脚本最初是在哪个 SQL 脚本上创建的 造成这种情况的原因是什么以及如何解决 这是由 DOS Win
  • 如何用分隔符分割 pandas 列并选择首选元素作为替换

    我有以下熊猫数据框 import pandas as pd df pd DataFrame gene 1 foo blabla 2 bar lalala 3 qux trilil 4 woz hohoho cell1 5 9 1 7 cel
  • 操作栏选项卡中的 MapFragment

    我正在尝试构建一个将实现操作栏选项卡的应用程序 其中一个选项卡应包含 MapFragment 如何实现带有选项卡的操作栏 其中一个选项卡下有一个地图片段 你能帮我解决这个问题吗 这是我到目前为止所拥有的 主班 package com nfc
  • Celery:从任务中撤销整个链的干净方法

    我的问题可能非常基本 但我仍然无法在官方文档中找到解决方案 我在 Django 应用程序中定义了一个 Celery 链 执行一组相互依赖的任务 chain tasks apply fetching decision s x y tasks