Spec-Zone.ru › Ruby 3.3

класс Rinda::TupleSpace

Родитель:
Объект
Включенные модули:
DRb::DRbUndumped, MonitorMixin

Пространство кортежей управляет доступом к содержащимся в нём кортежам, гарантируя соблюдение требований взаимного исключения.

Опция sec для методов write, take, move, read и notify может быть либо числом секунд, либо объектом Renewer.

Публичные методы класса

new(period=60) Показать исходный код
# 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

Создаёт новый TupleSpace. period используется для управления частотой поиска устаревших кортежей после изменений в TupleSpace.

Если устаревших кортежей не найдено period секунд после последнего изменения, TupleSpace прекратит поиск устаревших кортежей.

Вызывает метод суперкласса MonitorMixin::new

Публичные методы экземпляра

move(port, tuple, sec=nil) { |template| ... } Показать исходный код
# 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

Перемещает tuple в port.

notify(event, tuple, sec=nil) Показать исходный код
# 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

Регистрируется для уведомлений о event. Возвращает NotifyTemplateEntry. Смотрите NotifyTemplateEntry для примеров прослушивания уведомлений.

event может быть:

‘write’

Кортеж был добавлен

‘take’

Кортеж был взят или перемещён

‘delete’

Кортеж был потерян после перезаписи или истечения срока действия

TupleSpace также уведомит вас об событии ‘close’, когда NotifyTemplateEntry истечёт.

read(tuple, sec=nil) { |template| ... } Показать исходный код
# 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

Читает tuple, но не удаляет его.

read_all(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

Возвращает все кортежи, соответствующие tuple. Не удаляет найденные кортежи.

take(tuple, sec=nil, &block) Показать исходный код
# File lib/rinda/tuplespace.rb, line 477
def take(tuple, sec=nil, &block)
  move(nil, tuple, sec, &block)
end

Удаляет tuple

write(tuple, sec=nil) Показать исходный код
# 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

Добавляет tuple

Приватные методы экземпляра

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) Показать исходный код
# 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

Уведомляет всех зарегистрированных слушателей о изменении статуса event для tuple.

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

Создаёт поток, который сканирует пространство кортежей на наличие истекших кортежей.

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API