用例scala.concurrent.blocking

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

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

我有些疑惑:

  • 新线程将会产生什么影响?
  • 这仅适用于scala.concurrent.ExecutionContext.Implicits.global执行上下文还是用于用户创build的执行上下文?
  • 如果我用blocking {}封装了任何可执行文件会发生什么?
  • 任何实际使用情况下,我们应该使用这个构造。
  1. 当检测到fork / join池中的所有线程正在使用join构造相互等待时,fork / join池中会产生新线程,并且还有更多的工作要完成,可能会完成其中一个线程。 或者,如果其中一个ForkJoinWorker线程正在执行的代码不是通过使用join来阻止,则可以使用ManagedBlocker通知该池。
  2. 它可能适用于任何types的执行上下文 – 它作为ExecutionContext实现的通知,由工作线程执行的代码在某些情况下可能被阻塞,并且这种情况可能通过使用其他的计算来解决线。 执行上下文可能会或可能不会对此起作用。 在当前的(2.10,2.11)实现中, blocking只能使用默认的全局执行上下文。
  3. 如果你使用阻塞来封装任何可执行文件,会导致一些运行时间的开销,所以不要总是这样做。
  4. 如果您的计算持续了很长时间(例如,秒或分钟),或者您正等待将来完成使用Await ,或者您正在等待显示器的条件解决,并且可以通过其他任务来解决此问题/将来应该在相同的执行上下文执行 – 在所有这些情况下,你应该使用blocking

编辑:

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

我总是发现官方的文档在阻塞结构方面有点差; 因此我试图在这篇博文中更清楚地解释这个问题,并举例说明如何实现自己的function以及如何在底层进行操作。