gpt4 book ai didi

noflo - 在发送数据包之前,应使用以下哪种方法来等待所有端口上的输入?

转载 作者:行者123 更新时间:2023-12-01 20:00:05 26 4
gpt4 key购买 nike

我仍然从流程的角度了解 FBP 和 NoFlo 的工作原理,因此虽然我可以将一些东西组合在一起来完成这项工作,但我不确定是否会在其他地方引入问题。

在本例中,我正在创建一个组件,该组件在将数据发送到输出端口之前等待其 2 个端口上的输入。为什么?我需要来自两个输入的数据来构造输出数据包(组名称和输入数据包)。

我已经成功地使用两种方法实现了这一目标,我想知道哪种方法更好,或者至少每种方法的优点/缺点。

我在这里讨论的组件是 vizicities/Group:

enter image description here

方法 1:在内部对来自 input1 的数据包进行排队,直到 input2 收到数据包

var noflo = require("noflo");

exports.getComponent = function() {
var AddGroup = new noflo.Component();
AddGroup.description = "This component adds a group to the data packets";

var packets = [];
var groupName = "";

// Register ports and event handlers
AddGroup.inPorts.add("in", { datatype: "all" }, function(event, payload) {
switch (event) {
case "begingroup":
AddGroup.outPorts.out.beginGroup(payload);
break;
case "endgroup":
AddGroup.outPorts.out.endGroup();
break;
case "data":
// Queue packet
packets.push(payload);
break;
case "disconnect":
// Only send output if group has been set
if (groupName) {
for (var i = 0; i < packets.length; i++) {
AddGroup.outPorts.out.beginGroup(groupName);
AddGroup.outPorts.out.send(packets);
AddGroup.outPorts.out.endGroup();
}

// Disconnect output port when input port disconnects
AddGroup.outPorts.out.disconnect();
}
break;
}
});

AddGroup.inPorts.add("group", { datatype: "string" }, function(event, payload) {
switch (event) {
case "begingroup":
break;
case "endgroup":
break;
case "data":
groupName = payload;
break;
case "disconnect":
// TODO: Does this dupe anything with the same logic on the in port?
// Only send output if group has been set
if (groupName) {
for (var i = 0; i < packets.length; i++) {
AddGroup.outPorts.out.beginGroup(groupName);
AddGroup.outPorts.out.send(packets);
AddGroup.outPorts.out.endGroup();
}

// Disconnect output port when input port disconnects
AddGroup.outPorts.out.disconnect();
}
break;
}
});

AddGroup.outPorts.add("out", { datatype: "all" });

return AddGroup; // Return new instance
};

方法 2:使用 WirePattern 帮助程序

var noflo = require("noflo");

exports.getComponent = function() {
var AddGroup = new noflo.Component();
AddGroup.description = "This component adds a group to the data packets";

var config = {
in: ["in", "group"],
out: "out"
};

AddGroup.inPorts = new noflo.InPorts({
in: {
datatype: "string",
required: true
},
group: {
datatype: "string",
required: true
}
});

AddGroup.outPorts = new noflo.OutPorts({
out: {
datatype: "all"
}
});

noflo.helpers.WirePattern(AddGroup, config, function(data, groups, outPort) {
outPort.beginGroup(data.group);
outPort.send(data.in);
outPort.endGroup();
});

// Return new instance
return AddGroup;
};

这两种方法似乎都有效,但显然使用其中一种方法肯定有理由。有人可以帮我澄清一下吗?

最佳答案

WirePattern 是现代 NoFlo 中推荐的方式,因为它可以在需要时为您提供对数据包同步的额外控制。当所有必需的输入获取数据时,您可以触发,或者您可以要求严格的组(甚至数据包有效负载)匹配。

许多常见的 NoFlo 组件仍在等待 WirePattern 化,但对于任何新的东西,尤其是对于任何异步的东西,这是推荐的方式。

关于noflo - 在发送数据包之前,应使用以下哪种方法来等待所有端口上的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28169436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com