批处理的并行数据提取

时间:2019-04-02 20:37:28

标签: multithreading scala future

这种批处理集合子集以进行并行处理的模式可以吗?有没有更好的方法可以做到这一点,而我却不知道呢?

当给定需要从服务中获取的实体ID集合时,该实体ID返回一个scala Future,而不是立即发出所有请求,因此我们对它们进行批处理,因为该服务一次只能处理一定数量的请求。从某种意义上说,这是一种原始的节流机制,可以避免使数据存储不堪重负。看起来像是代码的味道。


object FutureHelper{
  def batchSerially[A, B, M[a] <: TraversableOnce[a]](l: M[A])(dbFetch: A => Future[B])(
    implicit ctx: ExecutionContext, buildFrom: CanBuildFrom[M[A], B, M[B]]): Future[M[B]] =
    l.foldLeft(Future.successful(buildFrom(l))){
      case (accF, curr) => for {
        acc <- accF
        b <- dbFetch(curr)
      } yield acc += b
    }.map(s => s.result())
}

object FutureBatching extends App {
  implicit val e: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global

  val entityIds = List(1,2,3,4,5,6)
  val batchSize = 2

  val listOfFetchedResults =
    FutureHelper.batchSerially(entityIds.grouped(batchSize)) {groupedByBatchSize =>
      Future.sequence{
        groupedByBatchSize.map( i => Future.successful(i))
      }
    }.map(_.flatten.toList)
}

1 个答案:

答案 0 :(得分:0)

我相信默认情况下Error loading backend config: 1 error(s) occurred: * terraform.backend: configuration cannot contain interpolations The backend configuration is loaded by Terraform extremely early, before the core of Terraform can be initialized. This is necessary because the backend dictates the behavior of that core. The core is what handles interpolation processing. Because of this, interpolations cannot be used in backend configuration. If you'd like to parameterize backend configuration, we recommend using partial configuration with the "-backend-config" flag to "terraform init". 将在创建Future后立即开始执行,因此scala.Future的调用将立即启动连接。由于dbFetch()将所有暂停的foldLeft转换为实际的Future对象,所以我认为批处理不会按照您想要的方式进行。

是的,我相信代码可以正常工作(请参见注释)。

另一种方法是让池定义并行度,但这并不总是有效的,具体取决于您的执行环境。

我在使用并行集合进行批处理方面取得了一些成功。例如,如果创建一个集合,其中元素的数量表示并发活动的数量,则可以使用A => Future[B]。例如,

.par