scala.concurrent.blocking
メソッドに出会いましたが、Scalaドキュメントによると、これは...
潜在的にブロックするコードを指定するために使用され、現在のBlockContextがランタイムの動作を調整できるようにします。ブロックコードを適切にマークすると、パフォーマンスが向上したり、デッドロックが回避されたりします。
私はいくつかの疑問があります:
scala.concurrent.ExecutionContext.Implicits.global
実行コンテキストのみに適用されますか、それともユーザー作成の実行コンテキストにも適用されますか?blocking {
... }
でラップするとどうなりますか?join
構造を使用して互いに待機していることを検出すると、fork/joinプールに生成されます。スレッドの1つを終了します。または、ForkJoinWorker
スレッドの1つがjoin
を使用する以外の方法でブロックするコードを実行している場合、 ManagedBlocker
s を使用してプールに通知できます。ExecutionContext
実装への通知として機能し、この条件はコンピューティングによって解決される可能性があります他のスレッドを使用する他の何か。実行コンテキストは、これに作用する場合としない場合があります。現在の(2.10、2.11)実装では、blocking
はデフォルトのグローバル実行コンテキストでのみ機能します。Await
を使用して将来の完了を待っているか、モニターの状態が解決されるのを待っています。この状態は、同じ実行コンテキスト-これらすべての場合、blocking
を使用する必要があります。編集:
Learning Concurrent Programming in Scala book の第4章をご覧ください。