Ping Simple
大多数应用程序将需要多个操作器。在本例中,我们将创建两个操作器,其中一个操作器将生成和发送数据,而另一个操作器将接收和打印数据。本例中的代码使用了内置的 PingTxOp 和 PingRxOp 操作器,它们在 holoscan::ops
命名空间中定义。
在本例中,我们将介绍
如何使用内置操作器。
如何使用
add_flow()
将操作器连接在一起。
示例源代码和运行说明可以在 GitHub 上的 examples 目录中找到,或者在 NGC 容器和 Debian 包中的 /opt/nvidia/holoscan/examples
下找到,以及它们的可执行文件。
这是一个涉及两个线性连接的操作器的工作流程示例。

图 5 线性工作流程
在本例中,源操作器 PingTxOp 生成从 1 到 10 的整数,并将其传递给接收器操作器 PingRxOp,后者将整数打印到标准输出。
我们可以通过在应用程序的 compose()
方法中调用 add_flow()
(C++
/Python
) 来连接两个操作器。
add_flow()
方法 (C++
/Python
) 接受源操作器、目标操作器和可选的端口名称对。端口名称对用于将源操作器的输出端口连接到目标操作器的输入端口。该对的第一个元素是上游操作器的输出端口名称,第二个元素是下游操作器的输入端口名称。如果操作器只有一个输入/输出端口,则可以使用空端口名称(“”)来指定端口名称。如果上游操作器中只有一个输出端口,而下游操作器中只有一个输入端口,则可以省略端口对。
以下代码显示了如何在我们的示例的 compose()
方法中定义线性工作流程。请注意,当操作器出现在 add_flow()
语句中时,不需要使用 add_operator()
单独添加到工作流程中。
#include <holoscan/holoscan.hpp>
#include <holoscan/operators/ping_tx/ping_tx.hpp>
#include <holoscan/operators/ping_rx/ping_rx.hpp>
class MyPingApp : public holoscan::Application {
public:
void compose() override {
using namespace holoscan;
// Create the tx and rx operators
auto tx = make_operator<ops::PingTxOp>("tx", make_condition<CountCondition>(10));
auto rx = make_operator<ops::PingRxOp>("rx");
// Connect the operators into the workflow: tx -> rx
add_flow(tx, rx);
}
};
int main(int argc, char** argv) {
auto app = holoscan::make_application<MyPingApp>();
app->run();
return 0;
}
定义 PingTxOp 和 PingRxOp 的头文件分别包含在第
2
行和第3
行。我们使用
make_operator()
函数(第10
行)创建一个 PingTxOp 的实例,名称为 “tx”,并约束其compute()
方法执行 10 次。我们使用
make_operator()
函数(第11
行)创建一个 PingRxOp 的实例,名称为 “rx”。tx 和 rx 操作器使用
add_flow()
(第14
行)连接。
from holoscan.conditions import CountCondition
from holoscan.core import Application
from holoscan.operators import PingRxOp, PingTxOp
class MyPingApp(Application):
def compose(self):
# Create the tx and rx operators
tx = PingTxOp(self, CountCondition(self, 10), name="tx")
rx = PingRxOp(self, name="rx")
# Connect the operators into the workflow: tx -> rx
self.add_flow(tx, rx)
def main():
app = MyPingApp()
app.run()
if __name__ == "__main__":
main()
内置的 holoscan 操作器 PingRxOp 和 PingTxOp 在第
3
行导入。我们创建一个名为 “tx” 的 PingTxOp 操作器实例,并约束其
compute()
方法执行 10 次(第8
行)。我们创建一个名为 “rx” 的 PingRxOp 操作器实例(第
9
行)。tx 和 rx 操作器使用
add_flow()
连接,这定义了应用程序的工作流程(第12
行)。
运行应用程序应该在您的终端中给出以下输出
Rx message value: 1
Rx message value: 2
Rx message value: 3
Rx message value: 4
Rx message value: 5
Rx message value: 6
Rx message value: 7
Rx message value: 8
Rx message value: 9
Rx message value: 10