如何在流程中制作流程?假设我有一个进程通过stdin获取输入并通过stdout发送输出。我希望有一个Flow流过它。因此Flow最初会启动流程,控制其输入和输出流,然后充当Map,通过将输入馈送到流程来将输入映射到输出?并最终在流结束时终止进程。在这种情况下,背压控制如何工作?
答案 0 :(得分:0)
这是一个非常基本的Flow that is "coupled",因此它会因输入或输出(接收器/源)的中断而终止。为简单起见,我假设没有标准输入的情况,但您可以对此进行调整,以添加一个不被忽略的Sink
和pipes input into the process:
// capture stdout from the "ls" command val runCmd: Source[Message, NotUsed] = { Source.fromIterator[Message](() => Process("ls").lineStream.toIterator.map(line => TextMessage.Strict(line))) } // create flow for emitting stdout source to client val messageStdout: Flow[Any, Message, NotUsed] = Flow .fromSinkAndSourceCoupled(Sink.ignore, runCmd)
对于背压,我的代码示例上方的通知是阻止map
操作(一次只有一个line
)。随着处理速度的增加,您可以开发一个异步解决方案,并且具有遵守mapasync定义的背压的最大并行度。