了解所有作业何时在 ExecutionContext.Implicits.global 内完成

Know when all jobs are completed in ExecutionContext.Implicits.global

我有一个简单的程序可以在 ExecutionContext.Implicits.global 中使用 futures 执行阻塞 IO。我想对执行此 IO 100 次的性能进行基准测试,但我的循环在所有未来完成之前就结束了。有没有一种方法只有在推送到 ExecutionContext 的所有任务完成时才终止?

在没有任何代码的情况下,我将提供一个简单的版本,但需要注意的是,这是一种不准确的测量方法,对于需要花费少量时间的事情来说并不是很好。仅当您的测量操作实际花费相当多的时间时才真正有用,因此大部分时间花在 Future 而不是测试代码中。

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global

val myList = (1 to 10)

val start = System.currentTimeMillis

val seqFutures = for (elem <- myList) yield {
    Future {
      Thread.sleep(5000) // blocking operation
    }
}

val result = Future.sequence(seqFutures)

Await.result(result, 30.seconds)
val end = System.currentTimeMillis

println(s"${end-start} seconds")

如果您要进行大量阻塞 IO 调用,则值得配置一个单独的执行上下文,该执行上下文具有更大的线程池,专门用于阻塞 IO 以避免阻塞 IO 消耗您的所有线程。