map(T=>;Future[U])和flatMapConcat(T=>;Source.fromFuture(Future[U])之间的Akka流差异
请问,这两种定义接收器的方法有什么区别[RandomCdr,Future[Done]map(T=>;Future[U])和flatMapConcat(T=>;Source.fromFuture(Future[U])之间的Akka流差异,akka,akka-stream,Akka,Akka Stream,请问,这两种定义接收器的方法有什么区别[RandomCdr,Future[Done] Flow[RandomCdr] .grouped(bulkSize) .flatMapConcat{ (bulk : Seq[RandomCdr]) => Source.fromFuture(collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))
Flow[RandomCdr]
.grouped(bulkSize)
.flatMapConcat{ (bulk : Seq[RandomCdr]) =>
Source.fromFuture(collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))
}
.toMat(Sink.ignore)(Keep.right)
Flow[RandomCdr]
.grouped(bulkSize)
.map((bulk : Seq[RandomCdr]) => collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec))
.toMat(Sink.ignore)(Keep.right)
返回未来[T]的函数
collection.flatMap(uu.insert[RandomCdr](false)(randomCdrWriter,ec)。many(bulk)(ec))(ec)
是reactivemongo驱动程序的第一个代码段
这里,每个传入的批量都将转换为未来
,并且所说的未来
将在您提供的执行上下文中运行。只有在这一点上,下一个批量才会通过生成另一个未来
来处理,依此类推
基本上,期货是按顺序运行的。这与
Flow[RandomCdr]
.grouped(bulkSize)
.mapAsync(parallelism = 1){ (bulk : Seq[RandomCdr]) =>
collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec)
}
.toMat(Sink.ignore)(Keep.right)
第二段代码
在这里,每个传入的批量都将转换为一个未来
,它将在您提供的执行上下文中运行。未来
将立即传递到接收器。忽略
,其引用将被丢弃
使用此方法无法控制将同时运行多少个Future
s。因此,不建议使用此方法
如果要寻找改进的并行性,请考虑使用<代码> MAPASYNC 如上所示,并调整并行性参数。
< P> <强>第一个片段< /强> 这里,每个传入的批量都将转换为未来
,并且所说的未来
将在您提供的执行上下文中运行。只有在这一点上,下一个批量才会通过生成另一个未来
来处理,依此类推
基本上,期货是按顺序运行的。这与
Flow[RandomCdr]
.grouped(bulkSize)
.mapAsync(parallelism = 1){ (bulk : Seq[RandomCdr]) =>
collection.flatMap(_.insert[RandomCdr](false)(randomCdrWriter,ec).many(bulk)(ec))(ec)
}
.toMat(Sink.ignore)(Keep.right)
第二段代码
在这里,每个传入的批量都将转换为一个未来
,它将在您提供的执行上下文中运行。未来
将立即传递到接收器。忽略
,其引用将被丢弃
使用此方法无法控制将同时运行多少个Future
s。因此,不建议使用此方法
如果你正在寻找改进的并行性,请考虑使用<代码> MAPASYNC 如上所示,并调整并行性参数。
这是否意味着第二个片段不提供背压?正确,它将尽可能多地发射未来,而没有背压。这意味着第二个片段不提供背压?正确,它是WI。我们将在没有背压的情况下尽可能多地发射未来导弹