【问题标题】:Use case of scala.concurrent.blockingscala.concurrent.blocking 的用例
【发布时间】:2013-11-09 23:24:52
【问题描述】:

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

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

我有一些疑问:

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

【问题讨论】:

    标签: scala scala-2.10


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

    编辑:

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

    【讨论】:

    • 我们从使用blocking 中获得了什么?这应该只用于期货(不在主线程中)吗?
    • 你可以在任何地方使用它,但它只会影响工作线程,即使用Future { ... }执行的计算。
    • 已经在这里找到答案stackoverflow.com/questions/13097754/…
    • 似乎对如何做到这一点的“最佳实践”代码示例普遍感兴趣。
    • @Suma 我同意长时间运行的计算不符合 axel22 给出的定义,特别是第 2 点。长时间运行的计算不会从其他线程中计算的工作中受益,相反它会获得更少的资源来完成。我刚刚遇到了我们使用带有阻塞{}的akka​​ EC(ForkJoin)并用完线程的情况,因为我们有2k个这些长计算没有及时完成。我想听听阻塞{}如何使长时间运行的独立计算受益的理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2022-11-09
    • 2021-10-18
    • 2019-06-17
    • 2011-12-25
    • 2012-04-25
    相关资源
    最近更新 更多