首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rinda::TupleSpace

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

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

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

公共类方法

new(period=60)显示源

创建一个新的TupleSpace。period用于控制修改TupleSpace后多久查找死元组。

如果period在上次修改后几秒钟内没有发现死元组,TupleSpace将停止查找死元组。

调用超类方法MonitorMixin.new

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 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还会通知您'关闭'事件。

代码语言:javascript
复制
# 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,但不删除它。

代码语言:javascript
复制
# 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。不会删除找到的元组。

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# File lib/rinda/tuplespace.rb, line 477
def take(tuple, sec=nil, &block)
  move(nil, tuple, sec, &block)
end

write(tuple, sec=nil) 显示源

添加 tuple

代码语言:javascript
复制
# 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) 显示源

代码语言:javascript
复制
# File lib/rinda/tuplespace.rb, line 577
def create_entry(tuple, sec)
  TupleEntry.new(tuple, sec)
end

keep_clean() 显示源

删除死去的元组。

代码语言:javascript
复制
# 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?() 显示源

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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
# 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()显示源

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

代码语言:javascript
复制
# 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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com