Как я могу использовать группы в NoFlo?

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

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

1 ответ

Решение

Концепция групп описывается как "скобочные IP" в книге FBP.

В принципе begingroup а также endgroup это специальные типы пакетов, которые указывают, что пакеты данных, передаваемые между ними, содержат эту группу в качестве метаданных.

Думайте об этом немного как XML:

<somegroup>
  <innergroup>
    data
  </innergroup>
</somegroup>

В NoFlo это будет работать с:

@outPorts.out.beginGroup 'somegroup'
@outPorts.out.beginGroup 'innergroup'
@outPorts.out.send "data"
@outPorts.out.endGroup()
@outPorts.out.endGroup()

Получающий вход получает их через begingroup а также endgroup события и могут либо что-то сделать с ними, либо игнорировать их. Обычно хорошее поведение с компонентами, которые не используют группы, но выполняют некоторые преобразования информационных пакетов, - это, по крайней мере, передавать их дальше.

@inPorts.in.on 'begingroup', (group) =>
  @outPorts.out.beginGroup group
@inPorts.in.on 'data', (data) =>
  # do something and then send
@inPorts.in.on 'endgroup', =>
  @outPorts.out.endGroup()

Таким образом, группы можно рассматривать как способ предоставления некоторых "метаданных" для ваших пакетов. Например, когда NoFlo filesystem/ReadFile отправляет содержимое файла в виде пакета, окружает его группой, в которой указан путь к файлу.

Группы также могут быть очень полезны для объединения асинхронных потоков. Например, webserver/Server генерирует уникальный идентификатор группы для каждого получаемого запроса. Если вы выполняете запросы к базе данных или выполняете другие асинхронные операции до ответа на запрос, вы можете использовать эти группы для объединения результатов перед написанием ответа.

Другие вопросы по тегам