類別 Rinda::TupleSpace
Tuplespace 管理存取其包含的元組,確保符合互斥需求。
write、take、move、read 和 notify 方法的 sec
選項可以是秒數或 Renewer 物件。
公開類別方法
new(period=60) 按一下以切換來源
建立新的 TupleSpace
。period
用於控制在 TupleSpace
修改後,多久檢查一次失效元組。
如果在最後一次修改後的 period
秒數內未找到失效元組,TupleSpace
將停止尋找失效元組。
呼叫超類別方法
MonitorMixin::new
# File lib/rinda/tuplespace.rb, line 437 def initialize(period=60) super() @bag = TupleBag.new @read_waiter = TupleBag.new @take_waiter = TupleBag.new @notify_waiter = TupleBag.new @period = period @keeper = nil end
公開實例方法
move(port, tuple, sec=nil) { |template| ... } 按一下以切換來源
將 tuple
移至 port
。
# File lib/rinda/tuplespace.rb, line 484 def move(port, tuple, sec=nil) template = WaitTemplateEntry.new(self, tuple, sec) yield(template) if block_given? synchronize do entry = @bag.find(template) if entry port.push(entry.value) if port @bag.delete(entry) notify_event('take', entry.value) return port ? nil : entry.value end raise RequestExpiredError if template.expired? begin @take_waiter.push(template) start_keeper if template.expires while true raise RequestCanceledError if template.canceled? raise RequestExpiredError if template.expired? entry = @bag.find(template) if entry port.push(entry.value) if port @bag.delete(entry) notify_event('take', entry.value) return port ? nil : entry.value end template.wait end ensure @take_waiter.delete(template) end end end
notify(event, tuple, sec=nil) 按一下以切換來源
註冊 event
的通知。傳回 NotifyTemplateEntry
。請參閱 NotifyTemplateEntry
,了解如何聆聽通知的範例。
event
可以是
- ‘write’
-
已新增元組
- ‘take’
-
已取用或移動元組
- ‘delete’
-
在覆寫或逾期後,已遺失元組
當 NotifyTemplateEntry
過期時,TupleSpace
也會通知您 ‘close’ 事件。
# File lib/rinda/tuplespace.rb, line 567 def notify(event, tuple, sec=nil) template = NotifyTemplateEntry.new(self, event, tuple, sec) synchronize do @notify_waiter.push(template) end template end
read(tuple, sec=nil) { |template| ... } 按一下以切換來源
讀取 tuple
,但不會移除。
# File lib/rinda/tuplespace.rb, line 521 def read(tuple, sec=nil) template = WaitTemplateEntry.new(self, tuple, sec) yield(template) if block_given? synchronize do entry = @bag.find(template) return entry.value if entry raise RequestExpiredError if template.expired? begin @read_waiter.push(template) start_keeper if template.expires template.wait raise RequestCanceledError if template.canceled? raise RequestExpiredError if template.expired? return template.found ensure @read_waiter.delete(template) end end end
read_all(tuple) 按一下以切換來源
傳回所有符合 tuple
的 tuple。不會移除找到的 tuple。
# File lib/rinda/tuplespace.rb, line 545 def read_all(tuple) template = WaitTemplateEntry.new(self, tuple, nil) synchronize do entry = @bag.find_all(template) entry.collect do |e| e.value end end end
take(tuple, sec=nil, &block) 按一下以切換來源
移除 tuple
# File lib/rinda/tuplespace.rb, line 477 def take(tuple, sec=nil, &block) move(nil, tuple, sec, &block) end
write(tuple, sec=nil) 按一下以切換來源
新增 tuple
# File lib/rinda/tuplespace.rb, line 450 def write(tuple, sec=nil) entry = create_entry(tuple, sec) synchronize do if entry.expired? @read_waiter.find_all_template(entry).each do |template| template.read(tuple) end notify_event('write', entry.value) notify_event('delete', entry.value) else @bag.push(entry) start_keeper if entry.expires @read_waiter.find_all_template(entry).each do |template| template.read(tuple) end @take_waiter.find_all_template(entry).each do |template| template.signal end notify_event('write', entry.value) end end entry end
私人實例方法
create_entry(tuple, sec) 按一下以切換來源
# File lib/rinda/tuplespace.rb, line 577 def create_entry(tuple, sec) TupleEntry.new(tuple, sec) end
keep_clean() 按一下以切換來源
移除無效的 tuple。
# File lib/rinda/tuplespace.rb, line 584 def keep_clean synchronize do @read_waiter.delete_unless_alive.each do |e| e.signal end @take_waiter.delete_unless_alive.each do |e| e.signal end @notify_waiter.delete_unless_alive.each do |e| e.notify(['close']) end @bag.delete_unless_alive.each do |e| notify_event('delete', e.value) end end end
need_keeper?() 按一下以切換來源
檢查 tuple 空間是否需要清理。
# File lib/rinda/tuplespace.rb, line 631 def need_keeper? return true if @bag.has_expires? return true if @read_waiter.has_expires? return true if @take_waiter.has_expires? return true if @notify_waiter.has_expires? end
notify_event(event, tuple) 按一下以切換來源
通知所有已註冊的 event
偵聽器,tuple
的狀態已變更。
# File lib/rinda/tuplespace.rb, line 605 def notify_event(event, tuple) ev = [event, tuple] @notify_waiter.find_all_template(ev).each do |template| template.notify(ev) end end
start_keeper() 按一下以切換來源
建立一個執行緒,掃描 tuple 空間中的過期 tuple。
# File lib/rinda/tuplespace.rb, line 615 def start_keeper return if @keeper && @keeper.alive? @keeper = Thread.new do while true sleep(@period) synchronize do break unless need_keeper? keep_clean end end end end