scala - 了解 NotUsed 和 Done

标签 scala akka akka-stream

我很难理解 NotUsed 的目的和意义和 Done在 Akka Streams 中。

让我们看下面两个简单的例子:

使用未使用:

implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[NotUsed] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .to(Sink.foreach(println))

val runResult:NotUsed = myStream.run()

使用完成
implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[Future[Done]] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .toMat(Sink.foreach(println))(Keep.right)

val runResult: Future[Done] = myStream.run()

当我运行这些示例时,我在两种情况下都得到相同的输出:
STACKOVERFLOW //output

那么 NotUsed 和 Done 到底是什么?有什么区别,我什么时候应该更喜欢一个?

最佳答案

首先,你的选择是在NotUsed之间和 Future[Done] (不仅仅是 Done )。

现在,您基本上决定了 物化值通过使用不同的组合器( totoMatKeep.right ),您的图表。
物化值是一种在流运行时与流交互的方式。此选择不会影响您的流处理的数据,因此您会在两种情况下看到相同的输出。相同的元素(字符串“stackoverflow”)通过两个流。

选择取决于您的主程序在运行流后应该做什么:

  • 如果您不想与之互动,NotUsed是正确的选择。它只是一个虚拟对象,它传达了不允许也不需要与流交互的信息
  • 如果您需要监听流的完成以执行其他一些操作,您需要公开 Future[Done] .通过这种方式,您可以使用(例如)onComplete 为其附加回调。或 map .
  • 关于scala - 了解 NotUsed 和 Done,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46915579/

    相关文章:

    scala - 专门处理 Akka 流的第一个元素

    scala - 如何将分组按功能转换为数据框

    scala - Spark Dataframe - 获取所有对列表(Scala)

    scala - 如何在akka的发送和接收 Action 中添加日志功能

    scala - 在 Spray 路由中调用 Actor 并等待 Actor 的响应

    scala - 源流上的 Akka Streams mapConcat 运算符

    json - Akka HTTP流JSON反序列化

    regex - 如何从字符串中获取特定格式的所有子字符串

    scala - 在Scala中,如何使用 `Nothing`作为Fake方法的返回值?

    scala - 如何使用akka在scala中打开与TLS的TCP连接