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 版本与编译时相同。绕过访问限制的选项包括:
使用结构类型(下面的示例)。这在运行时使用反射。
在
scala
包中编写 Scalaobject
(示例如下)。编写 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.scala
相关用法
- Scala ExecutionContext.fromExecutorService用法及代码示例
- Scala Exclusive.combinations用法及代码示例
- Scala Expr.unapply用法及代码示例
- Scala Exclusive.runWith用法及代码示例
- Scala Exclusive.tails用法及代码示例
- Scala ExtraImplicits.infixOrderingOps用法及代码示例
- Scala Exclusive.sizeIs用法及代码示例
- Scala Exprs.unapply用法及代码示例
- Scala Exclusive.sortBy用法及代码示例
- Scala Exclusive.scanRight用法及代码示例
- Scala Exclusive.addString用法及代码示例
- Scala Exclusive.groupBy用法及代码示例
- Scala Exclusive.transpose用法及代码示例
- Scala ExtraImplicits.infixNumericOps用法及代码示例
- Scala Exclusive.collectFirst用法及代码示例
- Scala Exclusive.lengthIs用法及代码示例
- Scala Exclusive.inits用法及代码示例
- Scala Exclusive.mkString用法及代码示例
- Scala Exclusive.elementWise用法及代码示例
- Scala Exclusive.groupMap用法及代码示例
- Scala Exclusive.lazyZip用法及代码示例
- Scala Exclusive.groupMapReduce用法及代码示例
- Scala Exclusive.permutations用法及代码示例
- Scala Exclusive.sliding用法及代码示例
- Scala Exception.handling用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 ExecutionContext.global。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。