2012-02-28 30 views
3

トピックの検索リクエストを受信し、New York Times APIへのAPI呼び出しを行ってトピックに関連する記事を取得し、次にTwitter APIに送るプログラムに取り組んでいます。記事に言及したツイートを取得し、最終的に結果を処理して返します。マルチスレッドREST APIクライアント用のデザイン

私はこれをマルチスレッドにする必要があります。私は、固定サイズのスレッドプールでExecutorServiceを使うことを考えました。したがって、すべての着信検索要求は別のスレッドによって処理されます。 Callableインターフェイスを使用してタスクを送信します。 Callableを実装するクラスは、API処理(&にAPIリクエスト/応答を受けさせる)を行います。最後に結果がFutureによって取り出され、出力として表示されます。これは着信要求ごとに発生します。

これは意味がありますか?それとももっと良い方法がありますか?

EDIT:コマンドラインインターフェイスからデータを受け入れるローカルマシンでこれを実行しています。

+0

どのサーバーアプリケーションですか? –

答えて

5

これはWebアプリケーションの場合、デフォルトではマルチスレッドです。そうでない場合でも、サーブレットコンテナに展開することができれば有益です。スレッドプールは、基底のコンテナ(たとえばtomcat)によって提供されます。各要求は別のスレッドによって処理されます。気に

唯一のもの:

  • が​​
  • クリーンアップにあなたが
+0

これはWebアプリケーションではありません。私はローカルマシン上でCLIからデータを受け入れて実行しています。しかし、私はまだマルチスレッドにしたいと思っています。 – gofeddy

+1

なぜサーブレットコンテナで実行していないのですか? – Bozho

+0

私はこのオプションを最終的に検討すると思います。その前に、java.util.concurrentフィーチャセットを使って実装されたものを得ることができるかどうかを確認しようとしていました。 – gofeddy

2

を使用するすべてのThreadLocal変数を使用していない私は、ワークフローが正しく取得した後、参照をプロファイリングに焦点を当てますどこでボトルネックがあり、どこで同時実行性(スレッド!=同時実行性または非同期実行)が役立つかを調べようとしています。 CPU、ネットワーク、またはディスクI/Oを複数のスレッドで飽和させても、処理が高速化されることはなく、特にハイパースレッディングされたIntel CPUではパフォーマンスが低下することがあります。

次に、マルチスレッド化する前に非ブロッキングと非同期にすることが心配です。ブロッキング・タスク(直列化)は、スレッドを使用して同時実行する試みの利点を完全に無効にします。

マルチスレッドでは、タスクがワークフロー内でまだシリアル化されていると、より速く効率的に実行されるという魔法はありません。逆に、手作業でメッセージを渡したり非同期のものを持っていないと、処理が遅くなり効率が悪くなることさえあります。

また、これをCore i7ラップトップの上に実行している場合、4つの実際のスレッド(CPUハイパースレッドは通常、CPUバウンドのアプリケーションで悪化します)と、物事が連続した順序で起こってからそれらを取り戻すことは、あなたに本当の利益と複雑さをもたらさないかもしれません。より多くのコアサーバーでは、これはそうではないかもしれません。ラップトップではスレッドをたくさん得られません。

"並行処理を行うのは簡単で、並行処理を行うとが正しくになります。 - 合気道先生の言い換え

+0

[Node.JS](http://nodejs.org/)を使用して単純な非同期ソリューションのアイディアになるかどうかは不思議です... – beny23

+0

全体的にはそれほど重要ではないと思います。毎回異なるサイズのスレッドプールを使用して10〜15回のリクエストを送信しようとしましたが、レスポンスタイムに改善や変更は一度も見られませんでした。また、今、私はFuturesを使用してタスクを提出した後に結果を返すことが、このアプリケーションをブロックしていることがわかります。私はそれを非ブロッキングにすることができるかどうかを調べます。 – gofeddy

+0

@ Jarrod Roberson:* 4つのハイパースレッドは、通常、CPUバウンドアプリケーションで状況を悪化させます。[そして] * "ラップトップのスレッドでは、あなたにはあまり得られません" * [sic] ...見積もり、リンクは大歓迎です。 2番目の見積もりについては、私は繰り返し正確な反対を目の当たりにしてきました。データをクランチするために*プロデューサ/コンシューマ*スキームを使用すると、コンシューマスレッドの数をCPUの数に合わせるとスループットが向上します(古いCore 2 Duo Macラップトップなど)。マルチコアCPUの今日と現在では、シングルスレッドのプロデューサー/コンシューマーを本当に支持していますか? – TacticalCoder

関連する問題