Какой из этих подходов следует использовать для ожидания ввода на всех портах перед отправкой пакетов?

Я все еще многое узнаю о том, как FBP и NoFlo работают с точки зрения процесса, поэтому, хотя я могу собрать что-то вместе, которое выполняет эту работу, я не уверен, что создаю проблемы где-то еще.

В этом случае я создаю компонент, который ожидает ввода на каждом из своих двух портов, прежде чем отправлять данные на выходной порт. Почему? Мне нужны данные с обоих входов для создания выходного пакета (имя группы и входной пакет).

Мне удалось добиться этого, используя 2 подхода, и я хотел бы знать, какой подход лучше, или, по крайней мере, плюсы/минусы каждого подхода.

Компонент, о котором я говорю, это vizicities/Group:

введите здесь описание изображения

Подход 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;
};

Оба подхода, похоже, работают, хотя очевидно, что должна быть причина для использования одного над другим. Может ли кто-нибудь прояснить это для меня?


person Robin Hawkes    schedule 27.01.2015    source источник


Ответы (1)


WirePattern — это рекомендуемый способ в современном NoFlo, поскольку он предоставляет вам дополнительный контроль над синхронизацией пакетов, когда это необходимо. Вы можете активировать, когда все необходимые входные данные получат данные, или вы можете потребовать совпадения строгой группы (или даже полезной нагрузки пакета).

Многие распространенные NoFlo-компоненты все еще ждут WirePattern-изации, но для всего нового и тем более для всего асинхронного это рекомендуемый способ.

person bergie    schedule 28.01.2015
comment
Спасибо Анри, это проясняет ситуацию! Версия WirePattern также намного чище, поэтому я предпочел такой подход. В настоящее время я понимаю разницу между входными портами и параметрами, но, по крайней мере, все это работает. - person Robin Hawkes; 28.01.2015
comment
Порты параметров используются для настройки компонента. Если вы установите для них значение required, они должны быть предоставлены один раз, прежде чем ваш WirePattern сработает, но после этого значения сохраняются в c.params.<portname>. Необязательные порты параметров не блокируют выполнение WirePattern, поэтому могут иметь или не иметь значения в зависимости от того, как построен ваш график. - person bergie; 29.01.2015