Я построил tbb::flow::graph
который состоит из нескольких function_node
объекты. Во время выполнения я передаю несколько сообщений в график (от ~ 10 до ~ 100000). Иногда один из узлов выдает исключение. В этом случае выполнение всего графа отменяется, что означает, что все сообщения отбрасываются. Тем не менее, мои сообщения независимы друг от друга, и я не хочу, чтобы их выполнение было остановлено.
Я могу поймать исключение непосредственно внутри узла, но когда это произойдет, дальнейшая обработка сообщения не будет иметь смысла.
Поэтому мой вопрос: как я могу отменить или удалить одно сообщение из графика, не отменяя выполнение других сообщений, которые уже есть в графике?
Для узлов, которые могут вызвать исключение, используйте multifunction_node
вместо function_node
, Функтор тела multifunction_node
принимает кортеж из своих выходных портов и, в отличие от function_node
, следует явно поместить сообщения в эти порты. Следовательно multifunction_node
может отбрасывать / отбрасывать сообщения или создавать несколько выходов для каждого входа.
Обратите внимание, что несколько выходных портов multifunction_node
не предполагайте отдельный порт для каждого преемника. Вы можете иметь один выходной порт и подключить к нему всех преемников; выходное сообщение будет передаваться каждому преемнику так же, как function_node
делает. Однако несколько выходных портов позволяют multifunction_node
не ограничиваться одним типом вывода, что делает его очень гибким инструментом для сложной отправки сообщений в потоковом графе.
Для получения дополнительной информации об обработке сообщений различными узлами см. один толчок против широковещательного толчка, Другой концепции потокового графа, и политики поведения узлов в документации TBB.
Других решений пока нет …