当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Scala ExecutionContext.global用法及代码示例


global 方法(或属性)属于 scala.concurrent.ExecutionContext 对象(object),其相关用法说明如下。

用法:

final lazy val global: ExecutionContextExecutor

全局ExecutionContext.此默认 ExecutionContext 实现由 work-stealing 线程池支持。它可以通过以下系统属性进行配置:

  • scala.concurrent.context.minThreads = 默认为 "1"

  • scala.concurrent.context.numThreads = 默认为 "x1"(即当前可用处理器的数量 * 1)

  • scala.concurrent.context.maxThreads = 默认为 "x1"(即当前可用处理器的数量 * 1)

  • scala.concurrent.context.maxExtraThreads = 默认为 "256"

然后线程的池大小为numThreads,以低端的minThreads和高端的maxThreads为界。

maxExtraThreads 是在任何给定时间为避免死锁而拥有的最大额外线程数,请参见 scala.concurrent.blocking

global 执行上下文可以通过定义 implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global 或导入 ExecutionContext.Implicits.global 来显式使用。

批处理 short-lived 嵌套任务

使用 ExecutionContext.opportunistic 时,具有 short-lived 嵌套任务的异步代码执行效率更高(继续阅读以了解为什么它是 private[scala] 以及如何访问它)。

ExecutionContext.opportunistic 使用与 ExecutionContext.global 相同的线程池。它尝试批处理嵌套任务并在与封闭任务相同的线程上执行它们。这非常适合执行 short-lived 任务,因为它减少了上下文切换的开销。

警告:long-running 和/或阻塞任务应在 scala.concurrent.blocking -blocks 内划分,以确保当前批处理中的任何待处理任务都可以由 global 上的另一个线程执行。

如何使用

该字段为private[scala],以保持二进制兼容性。它是在 2.13.4 中添加的,直接引用它的代码无法使用 2.13.0-3 Scala 库运行。

库不应直接引用此字段,因为库的用户可能使用的是早期的 Scala 版本。为了在库中使用批处理ExecutionContext,代码需要回退到global,以防opportunistic 字段丢失(下面的示例)。生成的 ExecutionContext 在所有 Scala 2.13 版本中都有批处理行为(global 在 2.13.0-3 中是批处理)。

implicit val ec: scala.concurrent.ExecutionContext = try {
 scala.concurrent.ExecutionContext.getClass
   .getDeclaredMethod("opportunistic")
   .invoke(scala.concurrent.ExecutionContext)
   .asInstanceOf[scala.concurrent.ExecutionContext]
} catch {
 case _: NoSuchMethodException =>
   scala.concurrent.ExecutionContext.global
}

应用程序作者可以安全地使用该字段,因为运行时的 Scala 版本与编译时相同。绕过访问限制的选项包括:

  1. 使用结构类型(下面的示例)。这在运行时使用反射。

  2. scala 包中编写 Scala object(示例如下)。

  3. 编写 Java 源文件。这是因为 private[scala] 在 Java 字节码中作为 public 发出。

// Option 1
implicit val ec: scala.concurrent.ExecutionContext =
 (scala.concurrent.ExecutionContext:
   {def opportunistic: scala.concurrent.ExecutionContextExecutor}
 ).opportunistic

// Option 2
package scala {
 object OpportunisticEC {
   implicit val ec: scala.concurrent.ExecutionContext =
     scala.concurrent.ExecutionContext.opportunistic
 }
}

返回:

全局ExecutionContext

源码:

ExecutionContext.scala

相关用法


注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 ExecutionContext.global。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。