class Rinda::TupleSpace

要約

Tuple Space を表すクラスです。

このクラスのインスタンスを drb を経由して公開することでタプルスペースを他のプロセスからアクセスさせることができるようになります。

タプルスペースを drb 経由で利用する側は DRb::DRbObject.new_with_uri などでこのオブジェクトのリモートオブジェクトを取得し、Rinda::TupleSpaceProxy をかぶせることで利用します。

タプルの寿命と renewer

タプルを Rinda::TupleSpace#write などで追加するときにその寿命を秒数で指定することができます。タプルをタプルスペースに追加してからその秒数過ぎるとタプルは削除されます。

ただし、指定秒数を過ぎてもすぐには削除されず、Rinda::TupleSpace.new の引数で指定した秒数ごとに「掃除用スレッド」が動き、それによって cancel されたタプルや期限切れになったタプルが削除されます。

sec には秒数の代わりに renewer を指定することもできます。これは renew という名前を持つオブジェクトで、上で説明した掃除用スレッドによって renew メソッドが呼び出されます。renew が 正の秒数を返した場合、有効期限がその秒数に更新されます。ただし、renew はタプルの有効期限が切れていない場合のみ呼び出されます(有効期限切れのタプルは削除されます)。

Rinda::SimpleRenewer はシンプルな renewer で renewer のサンプル実装でもあります。このクラスはデフォルトで寿命を180秒後に変更します。つまりこのクラスのインスタンスを renewer に指定すると無限に renew され続けるように思われますが、そうではありません。このクラスは DRb::DRbUndumped を include しているので、オブジェクトが生成されたプロセスが止まるとそのオブジェクトは無効になります。その時点でrenewの呼び出しに失敗するようになるので、そこからしばらく(数分)するとそのタプルは有効期限切れとなります。

目次

特異メソッド
インスタンスメソッド

継承しているメソッド

MonitorMixinから継承しているメソッド

特異メソッド

new(period = 60) -> Rinda::TupleSpace[permalink][rdoc]

Rinda::TupleSpace オブジェクトを生成します。

period で掃除用スレッドが動く周期を指定します。このスレッドでは cancel されたタプルや expire(期限切れ、タイムアウト) されたタプルをタプルスペース内から取り除きます。

[PARAM] period:
cancel/expireされたタプルを取り除く周期を秒で指定します

インスタンスメソッド

notify(event, pattern, sec = nil) -> Rinda::NotifyTemplateEntry[permalink][rdoc]

event で指定した種類のイベントの監視を開始します。

イベントを生じさせたタプルがpattern にマッチした場合にのみ報告されます。

イベントが生じた場合、このメソッドの返り値の Rinda::NotifyTemplateEntry を経由し、 Rinda::NotifyTemplateEntry#each を用いて報告を受け取ります。

sec で監視期間を秒数で指定できます。 nil で無限に監視し続けます。

event として以下の3つを指定できます。

これで指定したイベントに加えて、有効期限切れによって監視が終了した場合には 'close' イベントが報告されます。

pattern で指定できるパターンについては rinda/rinda/タプルのパターンについて を参照してください。

[PARAM] event:
監視対象のイベント(文字列)
[PARAM] pattern:
監視対象となるタプルのパターン
[PARAM] sec:
監視期間の長さ(秒数)

require 'rinda/tuplespace'

tuplespace = Rinda::TupleSpace.new
observer = tuplespace.notify("write", ["xyz", nil, nil])
Therad.new do
  observer.each{|event, tuple| p event, tuple }
end

tuplespace.write(["xyz", 0, 1])
tuplespace.write(["pqr", 0, 1])
tuplespace.write(["xyz", 4, 2])
read(tuple, sec=nil) -> [Array|Hash][permalink][rdoc]

タプルスペース内の tuple にマッチするタプルを一つコピーして返します。

このメソッド呼び出しが終了しても、タプルスペースからタプルは取り除かれません。

tuple で指定できるパターンについては rinda/rinda/タプルのパターンについて を参照してください。

マッチするタプルが存在しない場合は、マッチするタプルがタプルスペースに投入されるまで待ちます。

sec でタイムアウト秒数を指定できます。待ち時間が sec 秒を過ぎた時には read をあきらめ例外 Rinda::RequestExpiredError を発生させます。 sec に nil を指定するとタイムアウトせずに無限に待ち続けます。

[PARAM] tuple:
タプルのパターン
[PARAM] sec:
タイムアウト秒数
[EXCEPTION] Rinda::RequestExpiredError:
read がタイムアウトした場合に発生します
[EXCEPTION] Ridna::RequestCanceledError:
read が何らかの理由でキャンセルされた場合に発生します。
read_all(tuple) -> [Array|Hash][permalink][rdoc]

タプルスペース内の tuple にマッチするタプルをすべてコピーして返します。

このメソッド呼び出しが終了しても、タプルスペースからタプルは取り除かれません。

tuple で指定できるパターンについては rinda/rinda/タプルのパターンについて を参照してください。

マッチするタプルが存在しない場合は、待たずに空の配列を返します。

このメソッドは主にデバッグのための利用を想定しています。

[PARAM] tuple:
タプルのパターン
take(tuple, sec = nil) -> Array | Hash[permalink][rdoc]

tuple にマッチするタプルをタプルスペースから取り出して返します。

tuple で指定できるパターンについては rinda/rinda/タプルのパターンについて を参照してください。

マッチするタプルが存在しない場合は、マッチするタプルがタプルスペースに投入されるまで待ちます。

sec でタイムアウト秒数を指定できます。待ち時間が sec 秒を過ぎた時には take をあきらめ例外 Rinda::RequestExpiredError を発生させます。 sec に nil を指定するとタイムアウトせずに無限に待ち続けます。

[PARAM] tuple:
タプルのパターン
[PARAM] sec:
タイムアウト秒数
[EXCEPTION] Rinda::RequestExpiredError:
take がタイムアウトした場合に発生します
[EXCEPTION] Ridna::RequestCanceledError:
take が何らかの理由でキャンセルされた場合に発生します。
write(tuple, sec = nil) -> Rinda::TupleEntry[permalink][rdoc]

tuple をタプルスペースに加えます。 tuple を管理するための Rinda::TupleEntry オブジェクトを返します。

sec で追加したタプルの有効期限を指定できます。追加されてから sec 秒過ぎたタプルはタプルスペースから削除されます。 nil は無限を意味し、この場合にはタプルは経過時間によっては削除されません。

返り値の Rinda::TupleEntry オブジェクトを使ってタプルを明示的にキャンセルしたり有効期限を変更したりできます。ただし、利用にはGCなどに気を付ける必要があります。詳しくはRinda::TupleEntry のエントリーを見てください。

[PARAM] tuple:
追加する tuple (配列かHash)
[PARAM] sec:
有効期限(秒数)
[EXCEPTION] Rinda::InvalidHashTupleKey:
不正な Hash tuple (キーが文字列以外のもの)を追加しようとすると発生します
[RETURN]
tuple 管理用の Rinda::TupleEntry オブジェクト