問題タブ [forkjoinpool]
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 - シリアル コードが最適に機能しているのに、Fork-Join プールで結果が生成されない
私が書いた他のシリアル コードは完全に動作しますが、この並列バージョンは何も出力せず、hello を出力するだけです。「hey」でテストしていますが、その行に到達することさえありません。オンラインで役立つリソースが見つかりません。
私がどこで間違っているのかを理解するのを手伝ってください。私は並列プログラミングが初めてです。
コードはメディアン フィルター プログラムで、配列 x=[2,80,6,3] が与えられると、フィルター処理された配列は y=[2,6,6,3] として計算されます。
y[1] = 中央値[2 2 80] = 2
y[2] = 中央値[2 80 6] = 中央値[2 6 80] = 6
y[3] = 中央値[80 6 3] = 中央値[3 6 80] = 6
y[4] = 中央値[6 3 3] = 中央値[3 3 6] = 3
java - Java Fork-Join が大きな ArrayList で機能しない
私は並列処理と同時実行にかなり慣れていないので、Java で Fork-Join を使用してメディアン フィルター アルゴリズムを実装しようとしています。基本的に、入力ファイルを ArrayList に読み込み、そのリストを使用して、フィルター処理された中央値 (元の ArrayList の最初と最後の要素を含む) の新しい ArrayList を生成します。
これで、アルゴリズムのシリアル/シーケンシャル バージョンを作成することができ、正常に動作しました。ただし、Fork-Join バージョンを作成しようとすると、大きな ArrayLists(100000+) では機能しないようです。サイズ 5 の非常に小さな ArrayList で試してみましたが、問題なく動作します。エラーを見つけることができないようです (論理エラーおよび/または実装エラーであると確信しています)。どんな助けでも大歓迎です。
シーケンシャル アルゴリズムのスニペットは次のとおりです。
これが私が作ったParallel Classです。これは機能していない部分です:
どんな助けでも本当に感謝しています。数時間を費やして SO と Google について多くの調査を行った後、これを正しく理解することはできません。
編集: music_coder は、私が直面しているエラーを投稿することを提案しました。それは多くのエラーです:
java - ThreadPoolExecutor と ForkJoinPool: サブタスクを盗む
Javaドキュメントから、
ForkJoinPool が他の種類の ExecutorService と異なるのは、主にワーク スティーリングを採用している点です。プール内のすべてのスレッドは、他のアクティブなタスクによって作成されたサブタスクを見つけて実行しようとします (存在しない場合は、最終的にワークの待機をブロックします)。
これにより、ほとんどのタスクが他のサブタスクを生成するときに効率的な処理が可能になります (ほとんどの ForkJoinTask がそうであるように)。コンストラクターで asyncMode を true に設定する場合、ForkJoinPools は、決して結合されないイベント スタイルのタスクでの使用にも適している場合があります。
以下のForkJoinPool の例を見た後、ThreadPoolExecutor とは異なり、キュー サイズを設定するパラメーターは見当たりませんでした。ForkJoinPool がどのようにメカニズムを盗むかについての手がかりは得られませんでした。
10 個のスレッドで ThreadPoolExecutor を作成し、3000 個の Callable タスクが送信されたとします。これらのスレッドは、サブタスクの実行負荷をどのように共有していますか?
また、ForkJoin プールは同じユースケースでどのように異なる動作をしますか?
java - クローラー URL フロンティアを管理するには?
彼ら
クローラーに訪問済みリンクを追加する次のコードがあります。リンクを抽出した後、個々のhref タグをループするfor ループがあります。
そして、リンクにアクセスして開いた後、上で定義した訪問済みリンク コレクション変数に URL を追加します。
クローラーの実装はマルチスレッドであり、100,000 の URL にアクセスした場合、クローラーを終了しなければ、日々成長すると想定しています。メモリの問題が発生しますか?スレッド間で矛盾を生じさせずに変数を更新するには、どのオプションが必要ですか?
前もって感謝します!
java - マルチスレッド ロギングの簡単な方法
マルチスレッドに forkjoinpool を使用し、ロギングに log4j を使用するプロジェクトに取り組んでいます。私たちのプロジェクトでは、複数の「ジョブ」が並行して実行されており、各ジョブは 1 つのスレッドによってのみ処理されます。
ロギングの問題は、対応するログ エントリにジョブ ID 情報が含まれるように、ロガーにジョブ ID のプレフィックスを付けることができるジョブのメイン フロー内にあります。ただし、各ジョブの処理に沿って、多くのユーティリティ API が呼び出され、そのような API 内からのログ エントリにはジョブ情報がありません。log4j はスレッド ID を出力するので、これはさまざまなジョブのログを区別する方法ですが、ユーティリティ API ログにジョブ ID を追加する最も簡単で最良の方法は何でしょうか?
正しい方向に進んでいるかどうかわからない、大まかに2つの考えがあります。
- スレッド名を自分のジョブ ID に置き換える方法があれば、log4j のデフォルトのスレッド プレフィックスで問題ないと思います。
- または、ロガーがジョブ情報を出力できるように、ロガーを入力として受け取るユーティリティ メソッドを作成する必要がありますか?
アドバイスしてください、ありがとう。