Scala Future + sleep运行得越来越慢

时间:2018-04-20 16:36:21

标签: multithreading scala concurrency future

以下代码段是并发任务。 我预计最后一项任务将在第一项任务后的第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中未提供此功能。

1 个答案:

答案 0 :(得分:2)

Future的身体不会立即被召唤。 它被传递给执行上下文,并根据其配置对其进行调度。 在您的情况下,global执行上下文具有基于CPU核心数的固定数量的线程。 如果池中有8个线程,则最后一个任务必须等待~42个任务在开始之前完成。