Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
if price < @limit print "--- #{time.to_s}: Цена ниже #@limit: #{price}n" end endendclass WarnHigh < Warner def update(time, price) # Обратный вызов наблюдателя. if price > @limit print "+++ #{time.to_s}: Цена выше #@limit: #{price}n" end endendDRb.start_serviceticker = DRbObject.new(nil, "druby://localhost:9001")WarnLow.new(ticker, 90)WarnHigh.new(ticker, 110)puts 'Нажмите [return] для завершения.'getsМодуль
DRbUndumpeddrbmodule DrbUndumpeddef _dump(dummy)raise TypeError, "can't dump"endendПриложение из этого раздела достаточно содержательно, и в то же время в нем легко разобраться. Есть и другие подходы к решению подобных задач. Но способ, показанный нами, демонстрирует простоту и элегантность распределенного Ruby.
20.3. Rinda: пространство кортежей в Ruby
Термин «пространство кортежей» появился в 1985 году, а сама идея еще старше. Кортежем называется массив или вектор, состоящий из элементов данных (как строка в таблице базы данных). Пространство кортежей — это большое объектное пространство, наполненное кортежами, нечто вроде «информационного супа».
Пока реализация пространства кортежей кажется ничем не примечательной. Но все становится гораздо интереснее, стоит лишь осознать, что к нему могут обращаться многие клиенты и доступ должен синхронизироваться. Короче говоря, это распределенная сущность; любой клиент может читать из пространства кортежей или писать в него, то есть его можно рассматривать как большое распределенное хранилище или даже способ коммуникации.
Первой реализацией пространства кортежей был проект Linda — исследование в области параллельного программирования, выполненное в Йельском университете в 1980-х годах. Реализация на языке Ruby (конечно, на основе библиотеки
drbКортеж в Rinda может быть массивом или хэшем. На хэш налагается дополнительное ограничение: все ключи должны быть строками. Вот несколько примеров простых кортежей:
t1 = [:add, 5, 9]t2 = [:name, :add_service, Adder.new, nil]t3 = { 'type' => 'add', 'value_1' => 5, 'value_2' => 9 }Элемент кортежа может быть произвольным объектом; это работает, потому что
drbDRbUndumpedПространство объектов создается методом
newrequire 'rinda/tuplespace'ts = Rinda::TupleSpace.new# ...Поэтому сервер выглядит так:
require 'rinda/tuplespace'ts = Rinda::TupleSpace.newDRb.start_service("druby://somehost:9000", ts)gets # Нажать Enter для завершения сервера.А клиент — так:
require 'rinda/tuplespace'DRb.start_servicets = DRbObject.new(nil, "druby://somehost:9000")# ...К пространству кортежей в Rinda применимы пять операций:
readread_allwritetakenotifyОперация чтения
readnilt1 = ts.read [:Sum,nil] # Может извлечь, например, [:Sum, 14].Обычно операция
readt2 = ts.read [:Result,nil],0 # Возбуждает исключение, если кортеж# не существует.Если мы точно знаем или предполагаем, что образцу будет соответствовать не один, а несколько кортежей, можно воспользоваться методом
read_alltuples = ts.read_all [:Foo, nil, nil]tuples.each do |t|# ...endМетод
read_allОперация
taketaket = ts.take [:Sum, nil] # Кортежа больше нет в пространстве кортежей.Может возникнуть вопрос, почему не существует явного способа удаления. Надо полагать, что этой цели служит метод take.
Метод
writenil
