75

我遇到了这个scala.concurrent.blocking方法,根据 Scala 文档,这是......

用于指定一段可能阻塞的代码,允许当前 BlockContext 调整运行时的行为。正确标记阻塞代码可以提高性能或避免死锁。

我有些疑惑:

  • 产生新线程的因素是什么?
  • 这是否仅适用于scala.concurrent.ExecutionContext.Implicits.global执行上下文或用户创建的执行上下文?
  • 如果我用blocking {...包装任何可执行文件会发生什么}
  • 我们应该使用此构造的任何实际用例。
4

1 回答 1

64
  1. 当它检测到 fork/join 池中的所有线程都在使用该构造相互等待时,新线程将在 fork/join 池中生成join,并且还有更多工作要完成,可能会完成其中一个线程。或者,如果其中一个ForkJoinWorker线程正在执行阻塞的代码,而不是 using ,它可以使用sjoin通知池。ManagedBlocker
  2. 它可能适用于任何类型的执行上下文——它作为实现的通知,ExecutionContext工作线程执行的代码可能在某些条件下阻塞,并且可以通过使用其他线程计算其他内容来解决此条件. 执行上下文可能会或可能不会对此起作用。在当前 (2.10, 2.11) 实现中,blocking仅适用于默认的全局执行上下文。
  3. 如果你用阻塞包装任何可执行文件,你会产生一些运行时开销,所以不要总是这样做。
  4. 如果您有一个持续很长时间的计算,例如几秒钟或几分钟,或者您正在等待未来完成使用Await,或者您正在等待监视器的条件得到解决,并且这个条件可以通过其他一些任务来解决/ future 应该在相同的执行上下文中执行——在所有这些情况下你应该使用blocking.

编辑:

考虑查看学习 Scala 中的并发编程一书的第 4 章。

于 2013-10-30T12:23:16.870 回答