3

独立して実行可能な数百の小さなタスクに分割できる 1 つの大きなタスクを考えてみましょう。より具体的には、それぞれの小さなタスクは、軽いネットワーク リクエストを送信し、サーバーから受信した応答を決定することです。これらの小さなタスクは 1 秒以上かかるとは予想されず、合計で数台のサーバーが関与します。

私は Executor フレームワークを使用してこれを実装する 2 つのアプローチを念頭に置いています。

  1. いくつか、たとえば 5 ~ 10 個のタスクを作成し、それぞれに一連の送受信を行います。
  2. 送信と受信ごとに 1 つのタスク (Callable または Runnable) を作成し、それらすべて (数百) をエグゼキューターによって実行するようにスケジュールします。

私の質問が、これらをテストして何が優れているかを自分で確認するのが面倒だと示している場合は申し訳ありません (少なくともパフォーマンスに関しては)。私の質問は、この特定のケースへの回答を見ながら、より一般的な側面を持っています。このような状況で、エグゼキュータを使用してすべてのスケジューリングやその他の処理を実行したい場合、小さなタスクをたくさん作成するのと、それらを少数の大きなタスクにグループ化するのとではどちらがよいでしょうか?

4

2 に答える 2

3

たくさんの小さなタスクを作成するのと、それらをより少ない数の大きなタスクにグループ化するのとではどちらが良いでしょうか?

このような質問で一般化するのは難しいですが、あなたの場合、それぞれが 5 ~ 10 個のタスクを実行するいくつかのタスクを作成し、それをエグゼキュータ サービスに送信するのは意味がないと思います。

私はすべての作業を個々の小さなタスクの束としてExecutorService. これにより、オブジェクト/コードの観点からタスクがよりクリーンになると思います。リクエスト/レスポンスのコレクションを持つ必要はなく、1 つのリクエストの作成と 1 つのレスポンスの処理に集中できます。

これに対する 1 つの例外は、特定のサーバーに同時要求を送信したくない場合です。その場合、特定のサーバーに対するすべての要求/応答をタスクに実行させ、各サーバーに対してタスクを送信することは理にかなっています。

于 2012-10-03T21:38:22.903 に答える
2

一般に、タスクはモジュールのようなものであり、要件が変更された場合でも、必要な方法で組み合わせることができるため、小さいタスクの方が優れていると言えます。

ただし、チャンクとしてしか実行できない場合は、1 つの大きなタスクでより良い概要が得られます。

もちろん、パフォーマンスも問題です。ただし、これはサーバー/マシンの CPU の数とシステム全体の負荷に大きく依存します。正確に何をしているのかを知っていたとしても、何がより効率的かを判断するためにテストする必要があります。ただし、タスクの初期化と管理にも時間がかかることに注意してください。アクションが非常に小さい場合は、実際の実行よりもタスク管理に多くの時間を費やす可能性があります。

すべての (小さな) タスクを並行して実行することも、要求を処理する必要がある応答サーバーにとって困難であることが判明する可能性があります。通常、Web サービスなどには、処理できる並列リクエストの数にも制限があることに注意してください。

于 2012-10-03T21:47:05.407 に答える