【问题标题】:How to remove/cancel a message from tbb::flow::graph?如何从 tbb::flow::graph 中删除/取消消息?
【发布时间】:2018-04-24 08:16:44
【问题描述】:

我构造了一个tbb::flow::graph,它由几个function_node 对象组成。在执行期间,我将多条消息传递到图表中(从 ~10 到 ~100000)。有时其中一个节点会引发异常。如果是这种情况,则取消整个图的执行,这意味着所有消息都将被丢弃。但是,我的消息是相互独立的,我不希望它们的执行被停止。

我可以直接在节点内捕获异常,但是当这种情况发生时,对消息的进一步处理就没有意义了。

所以我的问题是:如何在不取消执行图表中已经存在的其他消息的情况下从图表中取消或删除一条消息?

【问题讨论】:

  • 如果您在节点主体中捕获异常并自己处理它,那么图形将不会被取消。你有什么理由不能这样做吗?
  • 我在体内处理它。但是一旦抛出异常,该特定消息的进一步执行(将消息传递给节点的继任者)就变得无关紧要了。我只是想知道是否可以从图表中删除消息以消除一些开销,

标签: c++ tbb tbb-flow-graph


【解决方案1】:

对于可能引发异常的节点,请使用multifunction_node 而不是function_nodemultifunction_node 的主体函子接受其输出端口的元组,并且与 function_node 不同,应该显式地将消息放入这些端口。因此multifunction_node 可以丢弃/丢弃消息,或者为每个输入创建多个输出。

请注意,multifunction_node 的多个输出端口并不假定每个后继端口都有单独的端口。您可以有一个输出端口并将所有后继端口连接到它;输出消息将以与function_node 相同的方式广播给每个后继者。然而,多个输出端口允许multifunction_node 不受单一输出类型的限制,使其成为在流程图中进行复杂消息分发的非常灵活的工具。

有关不同节点处理消息的更多信息,请参阅 TBB 文档中的single-push vs. broadcast-push、其他flow graph conceptsnode behavior policies

【讨论】:

  • 这听起来很对。这里唯一困扰我的是“接受其输出端口的元组”。这是否意味着我必须知道该节点在编译时有多少个后继节点?这将是一个问题,因为图形是在运行时(从配置文件)生成的。
猜你喜欢
  • 2016-09-21
  • 2019-12-27
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多