Ruby 2.4

Rinda::TupleSpace

class Rinda::TupleSpace

父类:ObjectIncluded模块:DRb :: DRbUndumped,MonitorMixin

元组空间管理对其包含的元组的访问,从而确保满足互斥要求。

sec为写选择,采取,移动,读出并通知方法可以是若干秒或新生对象。

公共类方法

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| ... } 显示源

移动tupleport

# 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:

'写'

一个元组被添加

'采取'

元组被采纳或移动

'删除'

一个元组被覆盖或过期后丢失

当NotifyTemplateEntry过期时,TupleSpace还会通知您'关闭'事件。

# 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。不会删除找到的元组。

# 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() 显示源

删除死去的元组。

# 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?() 显示源

检查元组空间以查看是否需要清理。

# 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()显示源

创建一个线程,扫描元组空间的过期元组。

# 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