HOME > CONIT Labs.

CONIT Labs.

Javaで並列処理


最近では、WEB2.0時代というか、REST時代というか
WEBサービス時代というかHTTP-API時代というか
分散並列時代というか

API提供者側から見ると、
1つの処理をどれだけ早く処理するか?とか、ターンアラウンドタイムを短くするか?
という議論は、まだあるものの
ここ数年は
1つの処理は2秒かかっていいので、どれだけ多くのリクエストを同時並列に処理できるか?
という議論のほうが多くなってきました。

なんでかというと、ハードウェアの進化方法が
クロック競争から、コア数競争に変化したことで、
1台のマシンに4コア8コア16コアCPUと並列で処理する方が
可能となってきたバックグラウンドがあります。
(ハンドヘルドでも2コアが出てきましたし。)

そんな時に「java.util.concurrent」は便利ですので紹介します。

要件ソーシャルグラフAPIから、友達の友達の情報をとってくる。

単純に実装すると、2重ループの簡単なプログラムですね。

Aさんの友達一覧をソーシャルグラフAPIから取得
for (Aさんの友達 in Aさんの友達一覧 ){
Aさんの友達の友達一覧をソーシャルグラフAPIから取得
for (Aさんの友達の友達 in Aさんの友達の友達一覧 ){
Aさんの友達の友達の情報をソーシャルグラフAPIから取得
}
}
要件に対する答えはこれでOKです。

問題点1ソーシャルグラフAPIは1リクエストに対し3秒でレスポンスを返してくる。
リクエスト投げる処理が0.0001秒だとすると、3/3.0001が相手サーバの返信待ちです。

問題点2ソーシャルグラフ数が半端ない
友達平均100ならば、上記の処理は100*100=10000回のループします。
ソーシャルグラフAPIをコールする回数は、1+100+10000の10101回のAPIコールしますね。

問題点31と2を考慮すると、シードが一人だとしても、
データを取得するのに、30303秒(8.4時間程度)ですね。
1日で3人分しか処理できません。
どんなに速いマシンをもってしてもです。

補足)対象のソーシャルグラフAPIにバッチ処理モードがある場合は
100人分を1リクエストで処理可能かもしれませんが、今回は考慮しません。

そんな99%WAIT処理となる場合に、並列処理の出番なのです!!
Javaでいうと、java.util.concurrentの出番です。

java.util.concurrent.Executors

このプログラムが何をしているかというと、
10000個のソーシャルグラフAPIリクエストを
最大同時50個のスレッドによって、
順次処理していく事になります。

どれか1つのソーシャルグラフAPIリクエストが終わると
残りのキューに入っている51番目の処理を、とあるスレッドが
処理し始めます。

そんな感じで全体処理時間が50倍早くなります。
8時間かかっていた処理が、理論的には10分で終わるようになります。

This is 並列化!

#obj-cにもTaskQueueという名の同じような便利なスレッドを扱う処理系が実装されています。

  • 2011年04月03日
  • Java

コニット開発室

CONIT Official Tweet

CONIT Facebook FanPage

CONIT BLOG

株式会社コニット

SamuraiSmartphoneServices

Buy and take only medicines from online pharmacy ,]}$ drugs online has affordable prices. Brand name drugs Canadian pharmacy [*}: compare drug prices Canada delivering medicines at your door. Free online consultation at https://canada-pharmacy-store.com <;) order cialis highest value and quality. Is it legal to mail prescription drugs? Yes, Canadian drugs [.($ order viagra . After ordering you will be contacted by our managers and agree on the delivery details.