使用序列时,如何在播放框架中对承诺响应进行排序?
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)
我正在开发一个应用程序,其操作需要执行动态数量的 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)