Skip to content

Instantly share code, notes, and snippets.

@nimatrueway
Last active January 4, 2017 09:38
Show Gist options
  • Save nimatrueway/2911072f1c0eb731fe9285e1beda8a9d to your computer and use it in GitHub Desktop.
Save nimatrueway/2911072f1c0eb731fe9285e1beda8a9d to your computer and use it in GitHub Desktop.
Playing with ForkJoinPool of ExecutionContext.Implicits.global and inspecting its behavior when "blocking {}" is not used when advised to.
import java.util.concurrent.Executors
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
object FutureExperiment extends App {
val cores = Runtime.getRuntime.availableProcessors
val start = System.currentTimeMillis()
val sleepTime = 1001
// ------------------------------- select the test to run through this variable
val testToRun = test07
// -------------------------------
private def blockOp(workerIdx: Int*) = {
Thread.sleep(sleepTime)
val waitTime = (System.currentTimeMillis() - start) / 1000
println(s"Worker #${workerIdx.mkString(",")} finished after ~${waitTime} secs.")
waitTime
}
def test01 = {
(1 to (cores + 1)).map { i =>
Future {
blockOp(i)
}
}
}
def test02 = {
(1 to (cores + 1)).map { i =>
Future {
blocking {
blockOp(i)
}
}
}
}
def test03(implicit executionContext: ExecutionContext) = {
(1 to cores).map { i =>
Future {
blocking {
blockOp(1, i)
}
} (executionContext)
} ++
(1 to cores).map { i =>
Future {
blockOp(2, i)
} (executionContext)
}
}
def test04() = {
implicit val threadPool = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(cores * 2))
test03
}
def test05() = { // all {core * 5} tasks will be executed in parallel
(1 to cores * 2).map { i =>
Future {
blocking {
blockOp(1, i)
}
}
} ++
(1 to cores * 3).map { i =>
Future {
blocking {
blockOp(2, i)
}
}
}
}
def test06 = { // only 12 tasks will be executed in parallel
(1 to cores).flatMap { i =>
Future {
blocking {
blockOp(1, i)
}
} ::
Future {
blockOp(2, i)
} ::
Nil
} ++
(1 to cores).map { i =>
Future {
blocking {
blockOp(1, i)
}
}
}
}
def test07 = { // #{cores + 1 + 1} tasks will be executed in parallel
(1 to (cores + 1)).map { i =>
Future {
blocking {
blockOp(1, i)
}
}
} ++
(1 to cores * 3).map { i =>
Future {
blockOp(2, i)
}
}
}
val allTasks = Await.result(Future.sequence(testToRun), (sleepTime * 10) millis)
println(s"""
******************************************************************
Total Cores: ${cores}
Tasks: ${allTasks.length}
Grouped Execution Time [N tasks finished after ~M secs]: ${
allTasks
.groupBy(x => x)
.toList
.sortBy(_._1)
.map(i => s"[${i._2.length}, ~${i._1} sec]")
.mkString(" | ")
}
Maximum Execution Time: ${allTasks.max}
******************************************************************
""")
}
Worker #12 finished after ~1 secs.
Worker #6 finished after ~1 secs.
Worker #5 finished after ~1 secs.
Worker #1 finished after ~1 secs.
Worker #8 finished after ~1 secs.
Worker #2 finished after ~1 secs.
Worker #10 finished after ~1 secs.
Worker #3 finished after ~1 secs.
Worker #4 finished after ~1 secs.
Worker #7 finished after ~1 secs.
Worker #9 finished after ~1 secs.
Worker #11 finished after ~1 secs.
Worker #13 finished after ~2 secs.
******************************************************************
Total Cores: 12
Tasks: 13
Grouped Execution Time [N tasks finished after ~M secs]: [12, ~1 sec] | [1, ~2 sec]
Maximum Execution Time: 2
******************************************************************
Worker #10 finished after ~1 secs.
Worker #8 finished after ~1 secs.
Worker #13 finished after ~1 secs.
Worker #5 finished after ~1 secs.
Worker #3 finished after ~1 secs.
Worker #7 finished after ~1 secs.
Worker #2 finished after ~1 secs.
Worker #1 finished after ~1 secs.
Worker #6 finished after ~1 secs.
Worker #9 finished after ~1 secs.
Worker #4 finished after ~1 secs.
Worker #12 finished after ~1 secs.
Worker #11 finished after ~1 secs.
******************************************************************
Total Cores: 12
Tasks: 13
Grouped Execution Time [N tasks finished after ~M secs]: [13, ~1 sec]
Maximum Execution Time: 1
******************************************************************
Worker #1,7 finished after ~1 secs.
Worker #1,8 finished after ~1 secs.
Worker #1,11 finished after ~1 secs.
Worker #1,10 finished after ~1 secs.
Worker #1,6 finished after ~1 secs.
Worker #1,3 finished after ~1 secs.
Worker #1,4 finished after ~1 secs.
Worker #1,9 finished after ~1 secs.
Worker #1,5 finished after ~1 secs.
Worker #1,2 finished after ~1 secs.
Worker #2,1 finished after ~1 secs.
Worker #1,1 finished after ~1 secs.
Worker #1,12 finished after ~1 secs.
Worker #2,2 finished after ~2 secs.
Worker #2,3 finished after ~2 secs.
Worker #2,4 finished after ~2 secs.
Worker #2,7 finished after ~2 secs.
Worker #2,6 finished after ~2 secs.
Worker #2,9 finished after ~2 secs.
Worker #2,5 finished after ~2 secs.
Worker #2,10 finished after ~2 secs.
Worker #2,8 finished after ~2 secs.
Worker #2,12 finished after ~2 secs.
Worker #2,11 finished after ~2 secs.
******************************************************************
Total Cores: 12
Tasks: 24
Grouped Execution Time [N tasks finished after ~M secs]: [13, ~1 sec] | [11, ~2 sec]
Maximum Execution Time: 2
******************************************************************
Worker #1,11 finished after ~1 secs.
Worker #2,2 finished after ~1 secs.
Worker #2,3 finished after ~1 secs.
Worker #1,9 finished after ~1 secs.
Worker #1,7 finished after ~1 secs.
Worker #1,10 finished after ~1 secs.
Worker #1,12 finished after ~1 secs.
Worker #2,5 finished after ~1 secs.
Worker #2,7 finished after ~1 secs.
Worker #1,4 finished after ~1 secs.
Worker #2,10 finished after ~1 secs.
Worker #1,6 finished after ~1 secs.
Worker #1,1 finished after ~1 secs.
Worker #1,8 finished after ~1 secs.
Worker #1,3 finished after ~1 secs.
Worker #1,2 finished after ~1 secs.
Worker #2,6 finished after ~1 secs.
Worker #1,5 finished after ~1 secs.
Worker #2,1 finished after ~1 secs.
Worker #2,12 finished after ~1 secs.
Worker #2,11 finished after ~1 secs.
Worker #2,9 finished after ~1 secs.
Worker #2,8 finished after ~1 secs.
Worker #2,4 finished after ~1 secs.
******************************************************************
Total Cores: 12
Tasks: 24
Grouped Execution Time [N tasks finished after ~M secs]: [24, ~1 sec]
Maximum Execution Time: 1
******************************************************************
Worker #2,16 finished after ~1 secs.
Worker #1,15 finished after ~1 secs.
Worker #1,4 finished after ~1 secs.
Worker #1,2 finished after ~1 secs.
Worker #2,30 finished after ~1 secs.
Worker #1,24 finished after ~1 secs.
Worker #1,17 finished after ~1 secs.
Worker #2,13 finished after ~1 secs.
Worker #2,20 finished after ~1 secs.
Worker #1,16 finished after ~1 secs.
Worker #1,3 finished after ~1 secs.
Worker #2,3 finished after ~1 secs.
Worker #2,21 finished after ~1 secs.
Worker #2,23 finished after ~1 secs.
Worker #1,14 finished after ~1 secs.
Worker #2,26 finished after ~1 secs.
Worker #2,31 finished after ~1 secs.
Worker #2,22 finished after ~1 secs.
Worker #1,13 finished after ~1 secs.
Worker #1,19 finished after ~1 secs.
Worker #2,14 finished after ~1 secs.
Worker #2,29 finished after ~1 secs.
Worker #2,25 finished after ~1 secs.
Worker #1,23 finished after ~1 secs.
Worker #2,10 finished after ~1 secs.
Worker #2,2 finished after ~1 secs.
Worker #2,19 finished after ~1 secs.
Worker #1,8 finished after ~1 secs.
Worker #2,33 finished after ~1 secs.
Worker #1,10 finished after ~1 secs.
Worker #1,11 finished after ~1 secs.
Worker #1,5 finished after ~1 secs.
Worker #2,17 finished after ~1 secs.
Worker #2,12 finished after ~1 secs.
Worker #1,12 finished after ~1 secs.
Worker #1,9 finished after ~1 secs.
Worker #2,9 finished after ~1 secs.
Worker #1,20 finished after ~1 secs.
Worker #2,24 finished after ~1 secs.
Worker #2,7 finished after ~1 secs.
Worker #2,4 finished after ~1 secs.
Worker #1,6 finished after ~1 secs.
Worker #2,18 finished after ~1 secs.
Worker #2,32 finished after ~1 secs.
Worker #1,21 finished after ~1 secs.
Worker #2,35 finished after ~1 secs.
Worker #1,1 finished after ~1 secs.
Worker #2,36 finished after ~1 secs.
Worker #2,5 finished after ~1 secs.
Worker #1,18 finished after ~1 secs.
Worker #2,6 finished after ~1 secs.
Worker #1,22 finished after ~1 secs.
Worker #2,11 finished after ~1 secs.
Worker #2,28 finished after ~1 secs.
Worker #2,34 finished after ~1 secs.
Worker #2,15 finished after ~1 secs.
Worker #2,27 finished after ~1 secs.
Worker #1,7 finished after ~1 secs.
Worker #2,8 finished after ~1 secs.
Worker #2,1 finished after ~1 secs.
******************************************************************
Total Cores: 12
Tasks: 60
Grouped Execution Time [N tasks finished after ~M secs]: [60, ~1 sec]
Maximum Execution Time: 1
******************************************************************
Worker #1,2 finished after ~1 secs.
Worker #1,3 finished after ~1 secs.
Worker #1,5 finished after ~1 secs.
Worker #2,1 finished after ~1 secs.
Worker #2,2 finished after ~1 secs.
Worker #1,6 finished after ~1 secs.
Worker #1,1 finished after ~1 secs.
Worker #2,6 finished after ~1 secs.
Worker #1,4 finished after ~1 secs.
Worker #2,4 finished after ~1 secs.
Worker #2,5 finished after ~1 secs.
Worker #2,3 finished after ~1 secs.
Worker #2,7 finished after ~2 secs.
Worker #1,8 finished after ~2 secs.
Worker #1,7 finished after ~2 secs.
Worker #2,8 finished after ~2 secs.
Worker #2,9 finished after ~2 secs.
Worker #1,9 finished after ~2 secs.
Worker #1,10 finished after ~2 secs.
Worker #2,10 finished after ~2 secs.
Worker #1,11 finished after ~2 secs.
Worker #1,12 finished after ~2 secs.
Worker #2,11 finished after ~2 secs.
Worker #2,12 finished after ~2 secs.
Worker #1,2 finished after ~3 secs.
Worker #1,6 finished after ~3 secs.
Worker #1,8 finished after ~3 secs.
Worker #1,5 finished after ~3 secs.
Worker #1,1 finished after ~3 secs.
Worker #1,11 finished after ~3 secs.
Worker #1,7 finished after ~3 secs.
Worker #1,12 finished after ~3 secs.
Worker #1,10 finished after ~3 secs.
Worker #1,3 finished after ~3 secs.
Worker #1,9 finished after ~3 secs.
Worker #1,4 finished after ~3 secs.
******************************************************************
Total Cores: 12
Tasks: 36
Grouped Execution Time [N tasks finished after ~M secs]: [12, ~1 sec] | [12, ~2 sec] | [12, ~3 sec]
Maximum Execution Time: 3
******************************************************************
Worker #1,11 finished after ~1 secs.
Worker #1,1 finished after ~1 secs.
Worker #1,2 finished after ~1 secs.
Worker #1,5 finished after ~1 secs.
Worker #1,8 finished after ~1 secs.
Worker #1,13 finished after ~1 secs.
Worker #1,4 finished after ~1 secs.
Worker #1,9 finished after ~1 secs.
Worker #1,7 finished after ~1 secs.
Worker #1,3 finished after ~1 secs.
Worker #2,1 finished after ~1 secs.
Worker #1,12 finished after ~1 secs.
Worker #1,6 finished after ~1 secs.
Worker #1,10 finished after ~1 secs.
Worker #2,3 finished after ~2 secs.
Worker #2,4 finished after ~2 secs.
Worker #2,2 finished after ~2 secs.
Worker #2,5 finished after ~2 secs.
Worker #2,6 finished after ~2 secs.
Worker #2,7 finished after ~2 secs.
Worker #2,10 finished after ~2 secs.
Worker #2,9 finished after ~2 secs.
Worker #2,8 finished after ~2 secs.
Worker #2,12 finished after ~2 secs.
Worker #2,11 finished after ~2 secs.
Worker #2,14 finished after ~2 secs.
Worker #2,13 finished after ~2 secs.
Worker #2,15 finished after ~2 secs.
Worker #2,16 finished after ~3 secs.
Worker #2,17 finished after ~3 secs.
Worker #2,18 finished after ~3 secs.
Worker #2,19 finished after ~3 secs.
Worker #2,21 finished after ~3 secs.
Worker #2,22 finished after ~3 secs.
Worker #2,20 finished after ~3 secs.
Worker #2,24 finished after ~3 secs.
Worker #2,23 finished after ~3 secs.
Worker #2,27 finished after ~3 secs.
Worker #2,26 finished after ~3 secs.
Worker #2,25 finished after ~3 secs.
Worker #2,28 finished after ~3 secs.
Worker #2,29 finished after ~3 secs.
Worker #2,30 finished after ~4 secs.
Worker #2,31 finished after ~4 secs.
Worker #2,32 finished after ~4 secs.
Worker #2,33 finished after ~4 secs.
Worker #2,34 finished after ~4 secs.
Worker #2,35 finished after ~4 secs.
Worker #2,36 finished after ~4 secs.
******************************************************************
Total Cores: 12
Tasks: 49
Grouped Execution Time [N tasks finished after ~M secs]: [14, ~1 sec] | [14, ~2 sec] | [14, ~3 sec] | [7, ~4 sec]
Maximum Execution Time: 4
******************************************************************
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment