scala.concurrent.blocking的用例

时间:2013-10-30 11:47:52

标签: scala scala-2.10

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

  

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

我有些疑惑:

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

1 个答案:

答案 0 :(得分:54)

  1. 检测到新线程在fork / join池中生成 fork / join池中的所有线程都在相互等待 使用join构造,还有更多工作要完成 这可能会完成其中一个主题。 或者,如果其中一个ForkJoinWorker线程正在执行除使用join之外的其他阻塞的代码,则它可以使用ManagedBlockers通知池。
  2. 它可能适用于任何类型的执行上下文 - 它用作ExecutionContext实现的通知,即工作线程执行的代码在某些情况下可能会阻塞,并且可能会解决此问题通过使用其他线程计算其他东西。执行上下文可能会也可能不会对此采取行动。在当前(2.10,2.11)实现中,blocking仅适用于默认的全局执行上下文。
  3. 如果你用阻塞包装任何可执行文件,你会引起一些运行时开销,所以不要总是这样做。
  4. 如果您的计算持续时间很长,例如秒或分钟,或者您正在等待未来使用Await完成,或者您正在等待监视器的条件得到解决,并且这个条件可以通过应该在其上执行的其他任务/未来来解决执行上下文 - 在所有这些情况下,您应该使用blocking
  5. 编辑:

    请考虑查看Learning Concurrent Programming in Scala book中的第4章。