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| ... } 显示源
移动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
:
'写'
一个元组被添加
'采取'
元组被采纳或移动
'删除'
一个元组被覆盖或过期后丢失
当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