
分散オブジェクト環境を学ぶ
連載:HORBと遊ぼう(6)
やさしく学ぶ並列プログラミング
(2)いよいよ並列プログラミング |
HORBの非同期メソッドと同時実行性の保証について説明してきました。これでパラレル(並列)プログラミングを行うための基礎知識が得られたと思います。さあ、いよいよパラレルプログラミングにチャレンジしましょう。
■複数台のサーバのオブジェクトを実行
パラレルプログラミングの例題としては、複数台のサーバを立ち上げて、それぞれのサーバに配置されたリモートオブジェクトにメソッド処理を並列に実行させ、処理が終わったものの順にコールバックによりクライアントに結果を出力させるような内容にしています。
この例題で取り上げるシステム構成は以下のとおりです。マシンは1台で利用できるように、ポート番号を指定し、HORBサーバを複数台立ち上げることで、仮想サーバを実現します。処理イメージをオブジェクト図で表します(図8)。
![]() |
図8 処理イメージ |
ソースコードは、Client6.java(リスト9)です。コード中にホスト名とポート番号がハードコーディングされています(リスト9の5、6行目)ので実際に複数のマシンで試してみたいときは、この部分を変更してください。
001:import horb.orb.*; |
リスト9 Client6.java [examples\step9\] |
このソースコードで新たに説明すべき点は以下のとおりです。
●20行目……サーバにリモートオブジェクトを生成する
localhost、ポート8000、8001、8002にリモートオブジェクトを生成します。
●24〜29行目……仕事(longJobメソッド)を各サーバに振り分ける
この部分で、各サーバに生成されたリモートオブジェクトの非同期メソッドをリクエストしています。この作業は7行目のtasks配列分すべてのタスクを一挙に振り分けます。25行目の_setHandlerメソッド呼び出しは、コールバックメソッドrun(40行目)が呼ばれた際に、何回目のタスク呼び出しか判断するために毎回セットしています。
■実行結果
図9に実行結果を示します。いかがでしょうか。図9では、表示順は省略していますが、複数のサーバにパラレルに振り分けられたlongJobメソッドの処理結果が、終了した順にクライアントに返却されてきているのがお分かりになると思います。このようにパラレルプログラミングによっていろんな仕事を複数のマシンに割り当て、並列に処理することができるようになるのです。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
図9 実行結果 |
今回は、やさしいパラレルプログラミングということで、パラレルプログラミングに親しんでいただきました。実際には、サーバ間の通信例外をcatchしたりする設計が必要となります。
また、この例題では、生成されたリモートオブジェクトの負荷状態を無視して無条件に仕事(longJobメソッド)を依頼していますが、もっと、まともに設計するとすれば、サーバ負荷とSocket資源(注)を考慮したものにしなければなりません。特に、同時呼び出しが非常に多くなる可能性がある場合、Socket資源についてはできるだけ消費しないように非同期メソッド呼び出しのタイミングを設計しなければなりません。
具体的には、サーバ側の処理を終え、コールバックしてきたホストだけに次の仕事を依頼する方法などがあります。そうすれば非同期用のSocketは1本しか消費されません。または、1つのサーバに依頼する仕事の個数を限定するとよいでしょう(これを実現するには、サーバ側の代理オブジェクトの個数で調整すると簡単です)。前者のよい例題としては、HORBパッケージのexamples\async\Client6.javaにありますので、参考にしてみてください。また、このディレクトリには非同期メソッドのさまざまな使い方が説明されていますのでとても参考になると思います。
(注)HORBは非同期呼び出しを行う際に、並行処理を実行している分だけSocketを使っています。非同期メソッドが完了するとそのSocketは再利用されたり、長時間必要とされなければ解放されたりするようになっています。 |
では、この辺で今回は終わりたいと思います。HORB通じて、パラレルプログラミングの世界を楽しんでいただけましたか? 次回は、いよいよ最終回となります。お楽しみに!!
![]() |
Index | |
(1)非同期メソッドを理解する 非同期メソッド -OneWay呼び出し- 戻り値をもつ非同期メソッド呼び出し -Asyncメソッド- Asyncメソッドのコールバック呼び出し |
|
![]() |
(2)いよいよ並列プログラミング 複数台のサーバのオブジェクトを実行 実行結果 |
![]() |
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
![]() |
|
|
|
![]() |