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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。