scala.concurrent.blocking的用例

Sou*_*dra 71 scala scala-2.10

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

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

我有些疑惑:

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

axe*_*l22 58

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

编辑:

考虑一下Scala学习并发编程中的第4章.

  • 我们从使用阻塞获得了什么?是否应该仅将其用于期货(而不是在主线程中)? (2认同)
  • @Suma我同意长时间运行的计算不符合axel22给出的定义,特别是第2点.长时间运行的计算不会受益于在其他线程中计算的工作,相反,它将获得更少的资源来完成.我刚遇到我们使用带有阻塞{}的akka​​ EC(ForkJoin)并且线程耗尽的情况,因为我们有2k这些长时间的计算没有及时完成.我想听听有关阻止{}如何使长期独立计算受益的理由. (2认同)