$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

TupleSpace は Lindaのtuple spaceを模したThread間通信のクラスです。 tupleに型はなく、配列で表現します。 [tuplespace.rb]

tupleの例

['abc', 2, 5]
['matrix-1', 1, 6, 3.14]
["family", "is-sister", "Caronlyn", "Elinor"]

in()に渡すパターンの例


クラスメソッド

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

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の別名

Rinda

分散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

mandel

Ruby本のgtkmandel.rbを改造して、 Rindaを使ってマンデルブロ集合を複数のCPUで分散処理させるサンプルです。

交換されるtuple

要求は、 マンデルブロ集合の演算に必要なパラメータと、処理して欲しい範囲からなります。 計算結果は、 処理した範囲とその領域のRGBのデータです。 データにもうちょっと工夫の余地がありそう…。

遊び方

マシンが複数ある方が面白いですが、一つでもできます。 bondai, grape, lime というマシンがあるものとして説明します。

  1. bondaiで Rinda を起動する。
    bondai% ruby rinda.rb
    druby://bondai:750
    
  2. grapeで計算サーバーを起動する。
    grape% ruby mandel_e.rb druby://bondai:750
    
  3. bondaiで計算サーバーを起動する。
    bondai% ruby mandel_e.rb druby://bondai:750
    
  4. grapeでクライアントを起動する。
    grape% ruby mandel_s.rb druby://bondai:750
    
  5. grape, bondaiの計算サーバーが計算をはじめ、 じわじわクライアントに結果が表示される。
  6. limeで計算サーバーを起動する。
    lime% ruby mandel_m.rb druby://bondai:750
    
  7. limeも計算に参加する。処理される速度が全体として上がる。


bondaiでは、クライアント、TupleSpace、サーバーが、 lime, grapeではサーバーが動作する。limeのサーバーは実行中に追加された。


m_seki@mva.biglobe.ne.jp