Last active
January 4, 2017 09:38
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} | |
****************************************************************** | |
""") | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
****************************************************************** |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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