問題タブ [fork-join]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - InvokeAll/join 中に ForkJoinPool が停止する
ForkJoinPoolを使用 して、CPU を集中的に使用する計算を並列化しようとしています。ForkJoinPool についての私の理解では、タスクを実行できる限り機能し続けるということです。残念ながら、ワーカー スレッドがアイドリング/待機していることを頻繁に観察したため、すべての CPU がビジー状態に保たれているわけではありません。追加のワーカー スレッドを観察することさえありました。
非ブロッキングタスクを厳密に使用しようとしたため、これは予期していませんでした。私の観察は、 ForkJoinPool がスレッドを無駄にしているように見えるのと非常によく似ています。ForkJoinPool に多くのデバッグを行った後、推測があります。
サブタスクのリストに作業を分散するために、invokeAll() を使用しました。invokeAll() が最初のタスク自体の実行を終了した後、他のタスクへの参加を開始します。参加する次のタスクが実行中のキューの一番上に来るまで、これは正常に機能します。残念ながら、追加のタスクに参加せずに非同期で送信しました。私は、ForkJoin フレームワークが最初にこれらのタスクを実行し続けてから、残りのタスクの結合に戻ることを期待していました。
しかし、この方法ではうまくいかないようです。代わりに、待機中のタスクの準備が整うまで (おそらく他のワーカー スレッドによって実行される)、ワーカー スレッドは wait() の呼び出しを停止します。私はこれを確認しませんでしたが、join() を呼び出す一般的な欠陥のようです。
ForkJoinPool は asyncMode を提供しますが、これはグローバル パラメーターであり、個々の送信には使用できません。しかし、非同期にフォークされたタスクがすぐに実行されるのが好きです。
では、なぜ ForkJoinTask.doJoin() は、準備が整うまで (自分で実行するか、他のユーザーに盗まれるかのいずれか)、キューの一番上にある使用可能なタスクを単純に実行しないのでしょうか?
java - 正確にはどのように機能しますか? (フォークジョイン)
次のスニペットを書きました。
渡した 2 つのオブジェクトinvokeAll()
のうちの 1 つを自動的にフォークすることがわかります。RecursiveActionTry
私のラップトップには 2 つのコアしかありません。4 つのコアがあり、4 つのタスクを起動した場合はどうなりinvokeAll(right, left, backward, forward);
ますか?4 つのコアすべてを使用しますか? コアが2つしかないのでわかりません。
また、舞台裏で invokeAll(right, left)compute()
が最初の引数 (右) とfork + join
2 番目の引数 (左) を呼び出すかどうかも知りたいです。(RecursiveTask 拡張機能のように)。そうでなければ、並列処理を使用しないでしょうか? ちなみに、2 つ以上の引数がある場合はcompute()
、最初の引数を呼び出して、他のすべての引数をフォークしますか?
前もって感謝します。
c# - C# パーティショナーに相当する Java はありますか
私の現在のプロジェクトでは、Java で次の機能を複製しようとしていますが、コードのこの部分が正確に何をしているのかわかりません。
コメントの私の分析から、メッセージの数が 10 を超える場合、コードは C# のパーティショナー関数を使用して、受信されるメッセージの数がスレッド間で「均等に」分割される複数のスレッドを作成すると考えています。
さらに、このメソッドの後半のセクションでは、コメントが Red Black Tree に格納されている RecieveTask から受信したメッセージを参照します。RecieveTask メソッドの評価では、そのような並べ替えの実装は明らかにされず、Partitioner もこれを行うかどうかという疑問が生じます。
誰かが C# パーティショナー機能についての私の理解を確認または修正し、Java でこのタスクを達成する方法についてのアイデアを教えてもらえますか? Java 並行ライブラリーに関する私の経験は限られており、そのようなオプションが利用できるとは思いませんでした。
編集1:
並べ替えのソースが見つかりました。RecieveTask はメッセージを SortedSet に追加します。
編集2:
パーティショナーはタスクをグループに分割しているだけのように見えますが、複数のスレッドを作成するのは Parallel 関数です。
コメントで提案されているように Java の ForkJoinPool を呼び出すと、このパーティショニングは自動的に行われますか、それとも自分で作業を分割する必要がありますか?
作業量を分割する必要がある場合、可変範囲のメッセージで FutureTask の複数のインスタンスをどのように呼び出すのでしょうか?
java - Javaでフォーク/ジョインアルゴリズムのしきい値を設定するには?
フォーク/ジョイン アルゴリズムの適切なしきい値を特定するにはどうすればよいですか? 今のところ、いくつかのしきい値で任意に再生し、結果を確認します。しかし、最適なしきい値を設定するためのガイドラインやベストプラクティスはありますか?
私の例では、1_000_000 要素の配列を使用しています。
しきい値 von 100_000 を次のように変更します。
私にもっとパフォーマンスを与えてください。しかし、これは単なる任意のテストです。
誰かが私を助けることができますか?:)
java - fork() は最終的に計算を呼び出しますか?
私の理解では、別のスレッドを作成し、別のスレッドで compute() を実行します。join は再帰的に取得した結果をフェッチします。
fork()
電話かどうか知りたいcompute()
です。前もって感謝します。
java - asyncMode とはどういう意味ですか?
このjavadocから直接:
このクラスは、Runnable および Callable の adapt メソッドを提供します。これは、ForkJoinTask の実行を他の種類のタスクと混合する場合に使用できます。すべてのタスクがこの形式の場合、asyncMode で構築されたプールの使用を検討してください。
asyncMode
この文脈では、実際にはどういう意味ですか?でプールを構築するにはどうすればよいasyncMode
ですか?