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