@m_seki の

I like ruby tooから引っ越し

生き返るTupleSpaceのTC版

githubにtokyotuplestore.rbを追加した。Tokyo Cabinetを永続化(というより次回の起動のためのメモ)として使うTupleSpaceの部品。

PTupleSpaceを使うプロセスはただ一つのTupleStoreという永続係を持てます。なんでただ一つかというと、dRubyの参照情報として通常のObject.object_idではなくTupleStoreのKeyを用いるからです。

require 'rinda/ptuplespace'
require 'rinda/tokyotuplestore'

store = Rinda::TokyoStore.new('tokyo.tc')
Rinda::setup_tuple_store(store)
  
DRb.install_id_conv(Rinda::TupleStoreIdConv.new)
ts = Rinda::PTupleSpace.new
ts.restore
DRb.start_service('druby://localhost:23456', ts)
DRb.thread.join

storeって変数に束縛してるのがTokyo Cabinetを用いたTupleStore。ここは別のものに取り替えられます。
このプロセスを中断し、再起動してもタプルだけはさっきの状態で復帰します。クライアントとの接続は切れちゃうので、待合せの状態までも含めて完全に復帰することはできません。

require 'drb/drb'

ro = DRbObject.new_with_uri('druby://localhost:23456')
p ro.write([:hello, 'again'])
=> #<DRb::DRbObject:0x128874 @ref=[:TupleStoreId, "7"], @uri="druby://localhost:23456">

じつはTupleSpaceへのwriteには戻り値があって、自分がwriteしたタプルをあとでキャンセルできるようなハンドルが返ります。
このハンドルはTupleSpaceの寿命を超えて使うことができるように、参照情報に細工してあります。こんな風に。

@ref=[:TupleStoreId, "7"]