我想使用流来获取和处理多个资源。我有一个用户ID列表,我通过将ID映射到其他链接的迭代器来遍历列表。
到目前为止它运行良好,但是可以看到尽管使用mapAsyncUnordered
- 流源同步处理,一个接一个。我想知道是否会发生这种情况是因为我使用FileIO.toPath
作为接收器?或者我错过了什么?
代码非常简单:
import akka.stream._
import akka.stream.scaladsl._
implicit val system = ActorSystem("Local")
implicit val materializer = ActorMaterializer()
val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(Runtime.getRuntime.availableProcessors() * 4))
val src: Source[Int, NotUsed] = Source[Int](Conf.startId() to Conf.endId())
val flow = Flow[Int].mapAsyncUnordered(5)(userId ⇒ Future(LikesExtractor.extractUserList(userId))(ec))
.collect {
case Some(Likes(self, likes)) ⇒
likes.zip(Iterator.continually(self))
}.mapConcat(_.toList)
.map {
case ((liker, likee)) ⇒ ByteString(s"${likee.username},${liker.username}\n")
}
val f = src via flow runWith FileIO.toPath(new File(Conf.basePath()).toPath)
import concurrent.duration._
Await.ready(f, 20 minute)
sys.exit(0)
xref akka-user