$Id: tuple.html,v 1.7 2001/10/17 04:16:57 mas Exp $
TupleSpace
Lindaのtuple spaceを模したThread間通信のクラスです。
[ruby-list:23761] を読んでちょっと試したところ、
クラスでのマッチングもできるようにしました。
パターンの要素 === tupleの要素での比較となります。(2000-07-10)
TupleSpace は Lindaのtuple spaceを模したThread間通信のクラスです。
tupleに型はなく、配列で表現します。
[tuplespace.rb]
tupleの例
['abc', 2, 5]
['matrix-1', 1, 6, 3.14]
["family", "is-sister", "Caronlyn", "Elinor"]
in()に渡すパターンの例
- in(['abc'. 2, 5])
# ['abc', 2, 5]
- in(['matrix-1'. nil, nil, 3.14])
# ['matrix-1', 1, 6, 3.14]
- in(['family'. 'is-sister', String, String])
# ["family", "is-sister", "Caronlyn", "Elinor"]
クラスメソッド
- new
- TupleSpaceの生成
インスタンスメソッド
- in(pattern, non_block=false)
-
TupleSpaceからpatternにマッチしたtupleを取り出します。
patternは取り出したいtupleを示すパターンです。
マッチするtupleがないとき、ブロックします。
non_block=trueのとき、ブロックせずに ThreadError 例外を発生させます。
- get(pattern, non_block=false)
-
inの別名
- out(tuple,...)
-
TupleSpaceにtupleを入れます。
引数を複数書くことで、複数のtupleを一度に投入できます。
- put(tuple)
-
outの別名
SimpleTupleSpace は Lindaのtuple spaceを模したThread間通信のクラスです。
TupleSpaceよりもさらに限定したものとなっています。
tupleは、一つのキーと値を持ちます。
inではキーが等しいtupleを取り出すことができます。
[simpletuple.rb]
クラスメソッド
- new
- SimpleTupleSpaceの生成
インスタンスメソッド
- in(key, non_block=false)
-
SimpleTupleSpaceからkeyにマッチしたtupleの値を取り出します。
マッチするtupleがないとき、ブロックします。
non_block=trueのとき、ブロックせずに ThreadError 例外を発生させます。
- get(pattern, non_block=false)
-
inの別名
- out(key, value)
-
SimpleTupleSpaceにtupleを入れます。keyはtupleのキーとなり
これを使ってin()で検索します。
- put(tuple)
-
outの別名
分散Rubyを使って、
TupleSpaceを複数のスクリプトから共有させることができます。
01: #!/usr/local/bin/ruby
02: require 'drb' # drb-1.1b later
03: require 'tuplespace'
04: require 'thread'
05:
06: DRb.start_service(nil, TupleSpace.new)
07: puts DRb.uri
08: DRb.thread.join
- 06: TupleSpaceを作ってそれをデフォルトのオブジェクトとします。
- 07: 自局のURIを印字
mandel
Ruby本のgtkmandel.rbを改造して、
Rindaを使ってマンデルブロ集合を複数のCPUで分散処理させるサンプルです。
- mandel_s.rb …
クライアント。
全画面の演算をを数行ごとの処理に分割し、要求をTupleSpaceに投入します。
演算結果をTupleSpaceから取り出し、画面に表示します。
- mandel_e.rb …
計算サーバー。
TupleSpaceから要求を取り出し、指示された領域を演算します。
結果をTupleSpaceに戻します。
- mandel_m.rb …
やりとりするパラメータを保持するクラスMandelArgsが書いてある。
mandel_s.rb, mandel_e.rbからrequireされる。
MandelArgsをそのまま TupleSpace に入れると、
rinda.rb が MandelArgs を知らないため止まってしまう。
今回は、TupleSpaceに入れる時に Array にして送っている。
交換されるtuple
要求は、
マンデルブロ集合の演算に必要なパラメータと、処理して欲しい範囲からなります。
計算結果は、
処理した範囲とその領域のRGBのデータです。
データにもうちょっと工夫の余地がありそう…。
遊び方
マシンが複数ある方が面白いですが、一つでもできます。
bondai, grape, lime というマシンがあるものとして説明します。
- bondaiで Rinda を起動する。
bondai% ruby rinda.rb
druby://bondai:750
- grapeで計算サーバーを起動する。
grape% ruby mandel_e.rb druby://bondai:750
- bondaiで計算サーバーを起動する。
bondai% ruby mandel_e.rb druby://bondai:750
- grapeでクライアントを起動する。
grape% ruby mandel_s.rb druby://bondai:750
- grape, bondaiの計算サーバーが計算をはじめ、
じわじわクライアントに結果が表示される。
- limeで計算サーバーを起動する。
lime% ruby mandel_m.rb druby://bondai:750
- limeも計算に参加する。処理される速度が全体として上がる。
m_seki@mva.biglobe.ne.jp