Раздел «Язык Ruby».Rinda:

Система параллельного программирования Rinda

Rinda - Реализация системы параллельного программирования Linda для Ruby. (Существуют также реализации для языков Си, Fortran, Prolog, Python, Java - JavaSpaces из Jini.) Основано на идее общего для нескольких компьютеров Пространства Кортежей (TupleSpace), которое хранит в себе упорядоченные наборы (кортежи) объектов. Кортеж можно понимать как список или как массив. В Ruby, в отличие от других реализаций Linda, элементами кортежа являются любые объекты, в том числе - массивы, хеши. А сам кортеж Rinda реализует методы массива.

Операции над TupleSpace

take - получить совпадающий с указанным шаблоном кортеж. Кортеж удаляется из Пространства Кортежей. В случае отсутствия запрашивающий процесс блокируется. Шаблон - это кортеж, в котором вместо некоторых или всех объектов можно использовать регулярные выражения, классы или nil. Соответственно у искомого кортежа должно быть такое же количество элементов, они должны совпадать с указанным, или совпадать с регулярным выражением, или иметь указанный класс, или просто быть любым объектом (в случае указания nil).

write - поместить кортеж в Пространство Кортежей.

read - считать кортеж, совпадающий с шаблоном. В отличие от take не удаляет его из Пространства Кортежей. В случае отсутствия запрашивающий процесс блокируется.

read_all - считать все совпадающие с шаблоном кортежи. Возвращает пустой массив, в случае, если с заданным шаблоном не совпадает ни один хранимый кортеж.

Пример использования Rinda

Небольшой пример по использованию Rinda, показывающий всю простоту подхода. Представляет из себя распределённый калькулятор, поддерживающий сложение и вычитание. Запускать в том же порядке, в каком написаны данные скрипты.

Сервер хранилища (реализует Пространство Кортежей).

Часто называется WhiteBoard?

require 'rinda/tuplespace'                      # Подключить реализацию Rinda
URI = 'druby://localhost:1235'                  # Адрес нашего сервиса в рамках distributed Ruby (DRb). протокол://имя_компьютера:порт
DRb.start_service(URI, Rinda::TupleSpace.new)   # Запустить DRb сервис предоставляющий экземпляр хранилища кортежей другим программам
DRb.thread.join                                 # ждать завершения работы сервиса

Сервер - программа, выполняющая вычисления

require 'rinda/tuplespace'                      # Подключить реализацию Rinda
URI = 'druby://localhost:1235'                  # Адрес нашего Пространства Кортежей
DRb.start_service                               # Запустить DRb сервис на локальном компьютере.
ts = Rinda::TupleSpaceProxy.new(                # Создать Заместителя (Proxy) для Пространства кортежей
# Заместитель - это объект, имеющий те же методы, что и исходный объект, но позволяющий нам использовать исходный объект удаленно, 
# не задумываясь о реализации удаленного взаимодействия
DRbObject.new_with_uri(URI))                    # создаём его на основе DRbObject, который замещает наш сервис Rinda::TupleSpace, 
# находящийся по адресу URI.

pattern = %r{^[-+]$}                            # Задаём шаблон обрабатываемых операций в виде регулярного выражения. 
loop do                                         # В бесконечном цикле
op, p1, p2 = ts.take [pattern, Numeric, Numeric]#  Получаем из Пространства Кортеж из трёх элементов, в котором первый объект
# символ '+' или '-' (операция), а оставшиеся - числа.
result = p1.send(op, p2)                        #  выполняем метод + или - объекта p1 (первое число) путем посылки ему сообщения (как в SmallTalk)
ts.write ['result', result]                     #  Помещаем в Пространство результат в виде кортежа ['result', число]
end

Клиент - программа, заказывающая вычисления

require 'rinda/tuplespace'                      # Подключить реализацию Rinda
URI = 'druby://localhost:1235'                  # Адрес нашего Пространства Кортежей
DRb.start_service                               # Запустить DRb сервис на локальном компьютере.
ts = Rinda::TupleSpaceProxy.new(                # Создать заместителя Пространства Кортежей
 DRbObject.new_with_uri(URI))                   # на основе удалённого сервиса по указанному адресу

ts.write ['+', 569, 1438]                       # Поместить в Пространство Кортежей наш запрос на сложение

result = ts.take ['result', Numeric]            # Получить результат (программа будет ждать появления подходящего под шаблон кортежа)
puts result[1]                                  # Вывести полученное число (второй элемент кортежа)

Ссылки

-- AlexBreger - 28 Apr 2007

Attachment sort Action Size Date Who Comment down
DistributedRuby.pdf manage 117.7 K 29 Apr 2007 - 16:41 AlexBreger Distributed Ruby Presentation