scala.concurrent.ExecutionContext.Implicits.global の動作は何ですか? 質問する

scala.concurrent.ExecutionContext.Implicits.global の動作は何ですか? 質問する

scala.concurrent.ExecutionContext.Implicits.globalのドキュメントは実行コンテキスト特性は次のとおりです:

scala.concurrent.ExecutionContext.Implicits.global暗黙の を取得するために単純にインポートすることが可能ですExecutionContext。このグローバルコンテキストは、適切なデフォルトのスレッドプールです。

「合理的なデフォルト」とはどういう意味ですか?

ベストアンサー1

デフォルト

固定サイズですスレッドプール、マシン上のプロセッサと同じ数のスレッドがあります。適切なデフォルトは、ほとんどの場合、ほとんどのことに適しています。

「良い」スレッドプールとは何か

まず、マシン上のコアと同じ数のスレッドしかないことを理解することが重要です。他のスレッドはすべてデーモン スレッドと呼ばれ、キューイングと実行を賢く行うことが重要です (言語/ライブラリ レベルで)。

CachedThreadPool: 短命/低コストのタスクが多数

生成するスレッド プールのタイプは、実行しようとしているアクションによって大きく異なります。短時間しか実行されないアクション (データベース クエリなど) が多数ある場合は、キャッシュされたスレッド プールを使用します。

個々のタスクは比較的安価ですが、新しいスレッドを生成するのはコストがかかるため、キャッシュされたスレッドプール

FixedThreadPool: 長時間実行/コストのかかるタスク

上記とは対照的に、非常にコストのかかる操作の場合、メモリ、パフォーマンスなどのさまざまな理由から、一度に実行されるスレッドの数を制限する必要がある場合があります。

ForkJoinPool: 分割して支配する

このタイプのプールは、非常に大規模な計算を実行する必要があるが、個々のワーカーが計算できる小さなビットに分割できる場合に役立ちます。

リストはどんどん続きます。要するに、Scala は上記のすべての中間のものを提供します。具体的には、Scala は ForkJoinPool の作成を試み、最初の作成が失敗した場合はデフォルトで ThreadPoolExecutor を使用します。

try {
  new ForkJoinPool(
    desiredParallelism,
    threadFactory,
    uncaughtExceptionHandler,
    true) // Async all the way baby
} catch {
  case NonFatal(t) =>
    System.err.println("Failed to create ForkJoinPool for the default ExecutionContext, falling back to ThreadPoolExecutor")
    t.printStackTrace(System.err)
    val exec = new ThreadPoolExecutor(
      desiredParallelism,
      desiredParallelism,
      5L,
      TimeUnit.MINUTES,
      new LinkedBlockingQueue[Runnable],
      threadFactory
    )
    exec.allowCoreThreadTimeOut(true)
    exec
}

}

満杯ここにリストします。

おすすめ記事