使用Akka Streams,Scala异步读取多个文件

时间:2017-08-18 07:16:29

标签: scala file asynchronous stream akka

我想异步读取文件夹中的许多.CSV文件,并返回自定义案例类的Iterable。

我能用Akka Streams实现这个目标吗?

*我试图以某种方式根据文档平衡工作,但它有点难以管理...

或者

使用Actors是一个好习惯吗?(带有子节点的父Actor,每个孩子读取一个File,然后将Iterable返回给父节点,然后父节点组合所有Iterables?)

2 个答案:

答案 0 :(得分:3)

与@paul答案大致相同,但改进很小

{"a":["1","2","3","4","5","6"]}
4
4
No such node (b)
index out of bounds

答案 1 :(得分:1)

首先,您需要阅读/了解Akka流如何工作,包括Source,Flow和Sink。然后你就可以开始学习操作员了。

要并行执行多个操作,您可以使用运算符mapAsync在其中指定并行数。

  /**
    * Using mapAsync operator, we pass a function which return a Future, the number of parallel run futures will
    * be determine by the argument passed to the operator.
    */
  @Test def readAsync(): Unit = {
    Source(0 to 10)//-->Your files
      .mapAsync(5) { value => //-> It will run in parallel 5 reads
        implicit val ec: ExecutionContext = ActorSystem().dispatcher
        Future {
          //Here read your file
          Thread.sleep(500)
          println(s"Process in Thread:${Thread.currentThread().getName}")
          value
        }
      }
      .runWith(Sink.foreach(value => println(s"Item emitted:$value in Thread:${Thread.currentThread().getName}")))
  }

您可以在https://github.com/politrons/Akka

了解有关akka和akka流的更多信息