Как я могу использовать группы в 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
генерирует уникальный идентификатор группы для каждого получаемого запроса. Если вы выполняете запросы к базе данных или выполняете другие асинхронные операции до ответа на запрос, вы можете использовать эти группы для объединения результатов перед написанием ответа.