使用序列时,如何在播放框架中对承诺响应进行排序?

How promises responses are ordered in play framework when using sequence?

我正在开发一个应用程序,其操作需要执行动态数量的 HTTP 请求(从 1 到 12)。 我发现最好的方法是使用 Promises 和方法 "Promise.sequence" 来并行调用。

我有一个关于此方法的问题,它是否保证回复的顺序符合查询的顺序?

提前致谢!

假设您的意思是 Future.sequence(我猜 Promise.sequence 是 Play 的 Java 包装器),该顺序将得到尊重,因为它只是根据 foldLeft 实现的.

但让我们试试吧!我希望你不介意一点 Scala。

import java.util.concurrent.Executors

import scala.concurrent.{ExecutionContext, Future}

object TestFutures extends App {

  val computeContext = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(10))
  val readyContext = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(10))

  val futures = for (i <- 1 to 10) yield {
    val f = Future { Thread.sleep(1000 * (10 - i)); i } (computeContext)
    f.onSuccess { case j => println(s"$j is ready!") } (readyContext)
    f
  }

  implicit val sequenceContext = ExecutionContext.fromExecutorService(Executors.newSingleThreadExecutor())

  Future.sequence(futures).foreach(println)

}

结果是

10 is ready!

9 is ready!

8 is ready!

7 is ready!

6 is ready!

5 is ready!

4 is ready!

3 is ready!

2 is ready!

1 is ready!

Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)