Scala 计算ExecutionContext中的线程数
假设我想知道给定的Scala 计算ExecutionContext中的线程数,scala,concurrency,executioncontext,Scala,Concurrency,Executioncontext,假设我想知道给定的ExecutionContext中有多少线程 所以我写了一个这样的函数 def count(implicit ec: ExecutionContext): Int = { val promise = Promise[Unit] val counter = new AtomicInteger(0) for (_ <- 0 to 1000) Future { counter.getAndIncrement() Await.ready(promise
ExecutionContext
中有多少线程所以我写了一个这样的函数
def count(implicit ec: ExecutionContext): Int = {
val promise = Promise[Unit]
val counter = new AtomicInteger(0)
for (_ <- 0 to 1000) Future {
counter.getAndIncrement()
Await.ready(promise.future, Duration.Inf)
}
val result = counter.get()
promise.success(())
result
}
它是有效的,但我想知道
- 为什么第一次实施不起作用李>
- 如何改进“屏障”实施(例如,摆脱
)李>isReset
- 在
中计算线程的最佳方法是什么ExecutionContext
implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
Future(42)
ec.asInstanceOf[java.util.concurrent.ForkJoinPool].getPoolSize // : Int = 1
我相信使用反射或强制转换来访问底层java执行器会更容易,因为它有一个可用的线程getter。我曾经调试过一个奇怪的错误,但是我现在没有了,而且我在手机里,所以我很难再输入一次,但我希望这个建议能有所帮助。看看Scala github中的源代码,这就是我的想法。谢谢。其他问题呢?为什么不先“等待”实施工作?看起来
global
知道Await.ready
并添加新线程。Michael,因为Await使用托管阻塞通知池需要启动更多线程以避免饥饿。如果您使用了blocking{…}
@ViktorKlang,同样如此,谢谢。我应该查一下消息来源。在中找到阻塞
implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
Future(42)
ec.asInstanceOf[java.util.concurrent.ForkJoinPool].getPoolSize // : Int = 1