當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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