dev*_*ium 5 concurrency multithreading scala fork-join
我试图弄清楚blocking
构造。虽然还不清楚它的内部工作原理,但是我得到的一般想法是,只要我使用Scala的全局线程池,用blocking
上下文包装我的代码就可以确保线程池会为这项工作创造额外的空间(因为它不受CPU限制)。
(1 to 1000).foreach { i =>
Future {
println(i)
Thread.sleep(100 * 1000)
}
}
Run Code Online (Sandbox Code Playgroud)
将迅速显示只能同时运行8个作业,而
(1 to 1000).foreach { i =>
Future {
blocking {
println(i)
Thread.sleep(100 * 1000)
}
}
}
Run Code Online (Sandbox Code Playgroud)
将显示现在我们大约有250个同时工作。哇!然后让我措手不及的是
(1 to 1000).foreach { i =>
Future {
println(i)
Thread.sleep(100 * 1000)
}
}
('a' to 'z').foreach { c =>
Future {
blocking {
println(c)
Thread.sleep(100 * 1000)
}
}
}
Run Code Online (Sandbox Code Playgroud)
只会再次显示8个同时进行的作业-阻止的作业不会立即执行。
为什么是这样?blocking
上下文的内部机制到底是什么?
blocking
仅在您进入阻塞上下文后才会生效。由于您有 8 个非阻塞 future 正在运行,因此它不会启动任何新的 future,因此它们无法进入阻塞上下文。换句话说,Scala 在它们开始执行之前并不“知道”它们正在阻塞。
您可以将第二个片段视为这样工作:
blocking
,因此该实现为更多 future 腾出了空间。而你的最后一个片段的工作原理如下:
blocking
。