为什么我的阻塞 Futures 在单核上不 运行?
Why do my blocking Futures not run on single core?
当我 运行 在只有 1 个核心的低功率服务器上执行以下(简化)代码时:
implicit val context: ExecutionContextExecutor = scala.concurrent.ExecutionContext.global
Future(blocking {
while (true) {
java.lang.Thread.sleep(1000)
println("thread 1")
}
})
while (true) {
java.lang.Thread.sleep(1000)
println("main")
}
只有“main”出现在日志中。如果我增加服务器以拥有更多内核,那么它就可以工作。我究竟做错了什么?即使内核有限,如何使每个线程 Scala/Java 运行?
我的理解是运行时间应该用一些逻辑让一个线程执行一会儿,然后切换到另一个线程。
scalaVersion := "2.12.12"
经过一番尝试,我发现如果我对我的 EC 使用 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(30))
,它就可以工作。所以我对全球 EC & 阻塞的理解一定是错误的。
我无法重现这个问题。即使在单核上,使用 ExecutionContext.global
时也应该至少有一个线程可用,因为默认计算是
numThreads = Runtime.getRuntime.availableProcessors * 1
等等
Future(blocking {
while (true) {
java.lang.Thread.sleep(1000)
println("thread 1")
}
})
应该在该线程中执行,而
while (true) {
java.lang.Thread.sleep(1000)
println("main")
}
应该在主线程中执行。
请注意,即使只有一个线程可用,如果您一直使用 blocking {}
,那么新线程仍会产生直到 maxExtraThreads
scala.concurrent.context.maxExtraThreads = defaults to "256"
因此问题可能出在其他地方。
当我 运行 在只有 1 个核心的低功率服务器上执行以下(简化)代码时:
implicit val context: ExecutionContextExecutor = scala.concurrent.ExecutionContext.global
Future(blocking {
while (true) {
java.lang.Thread.sleep(1000)
println("thread 1")
}
})
while (true) {
java.lang.Thread.sleep(1000)
println("main")
}
只有“main”出现在日志中。如果我增加服务器以拥有更多内核,那么它就可以工作。我究竟做错了什么?即使内核有限,如何使每个线程 Scala/Java 运行?
我的理解是运行时间应该用一些逻辑让一个线程执行一会儿,然后切换到另一个线程。
scalaVersion := "2.12.12"
经过一番尝试,我发现如果我对我的 EC 使用 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(30))
,它就可以工作。所以我对全球 EC & 阻塞的理解一定是错误的。
我无法重现这个问题。即使在单核上,使用 ExecutionContext.global
时也应该至少有一个线程可用,因为默认计算是
numThreads = Runtime.getRuntime.availableProcessors * 1
等等
Future(blocking {
while (true) {
java.lang.Thread.sleep(1000)
println("thread 1")
}
})
应该在该线程中执行,而
while (true) {
java.lang.Thread.sleep(1000)
println("main")
}
应该在主线程中执行。
请注意,即使只有一个线程可用,如果您一直使用 blocking {}
,那么新线程仍会产生直到 maxExtraThreads
scala.concurrent.context.maxExtraThreads = defaults to "256"
因此问题可能出在其他地方。