web-dev-qa-db-ja.com

scala.concurrent.blockingの使用例

scala.concurrent.blockingメソッドに出会いましたが、Scalaドキュメントによると、これは...

潜在的にブロックするコードを指定するために使用され、現在のBlockContextがランタイムの動作を調整できるようにします。ブロックコードを適切にマークすると、パフォーマンスが向上したり、デッドロックが回避されたりします。

私はいくつかの疑問があります:

  • 新しいスレッドが生成される要因は何ですか?
  • これはscala.concurrent.ExecutionContext.Implicits.global実行コンテキストのみに適用されますか、それともユーザー作成の実行コンテキストにも適用されますか?
  • 実行可能ファイルをblocking { ... }でラップするとどうなりますか?
  • この構造を使用する必要がある実用的な使用例。
69
Sourav Chandra
  1. 新しいスレッドは、fork/joinプール内のすべてのスレッドがjoin構造を使用して互いに待機していることを検出すると、fork/joinプールに生成されます。スレッドの1つを終了します。または、ForkJoinWorkerスレッドの1つがjoinを使用する以外の方法でブロックするコードを実行している場合、 ManagedBlockers を使用してプールに通知できます。
  2. あらゆる種類の実行コンテキストに適用できる可能性があります-ワーカースレッドによって実行されたコードが何らかの条件でブロックしている可能性があるというExecutionContext実装への通知として機能し、この条件はコンピューティングによって解決される可能性があります他のスレッドを使用する他の何か。実行コンテキストは、これに作用する場合としない場合があります。現在の(2.10、2.11)実装では、blockingはデフォルトのグローバル実行コンテキストでのみ機能します。
  3. 実行可能ファイルをブロックでラップすると、実行時に多少のオーバーヘッドが発生するため、常に実行するとは限りません。
  4. 長時間続く計算がある場合、例えば秒または分、またはAwaitを使用して将来の完了を待っているか、モニターの状態が解決されるのを待っています。この状態は、同じ実行コンテキスト-これらすべての場合、blockingを使用する必要があります。

編集:

Learning Concurrent Programming in Scala book の第4章をご覧ください。

57
axel22