以下代码段是并发任务。 我预计最后一项任务将在第一项任务后的第5秒运行。但它运行任务间隔越来越长(完成程序的时间> 10秒)。
import java.time._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
(1 to 50).map { i =>
Future {Thread.sleep(100 * i)}.map { _ =>
println(s"run ${i}th task at ${LocalDateTime.now}")
}
}
更新:
我只想要限制启动之间具有相同时间间隔的并发。还有其他更好的方法吗?
更新:
以下代码片段几乎可以完成我想要的内容,但它具有与上述代码段不同的语义(在发生错误时内部等待,上面会立即停止;后者运行结束而不会失败。)
(1 to 50).map { i =>
Thread.sleep(100)
Future{println(s"run ${i}th task at ${LocalDateTime.now}")}
}
我也在考虑event loop
,但Scala stdlib中未提供此功能。
答案 0 :(得分:2)
Future
的身体不会立即被召唤。
它被传递给执行上下文,并根据其配置对其进行调度。
在您的情况下,global
执行上下文具有基于CPU核心数的固定数量的线程。
如果池中有8个线程,则最后一个任务必须等待~42个任务在开始之前完成。