Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
ts.write [:Add, 5, 9] # Хранить "вечно".ts.write [:Foo, "Bar"], 10 # Хранить 10 секунд.Здесь уместно будет сказать несколько слов о синхронизации. Предположим, что два клиента пытаются одновременно забрать (
takewritetakewriteМетод
notifyNotifyTemplateEntry•
write•
take• удаление (когда истекает срок хранения кортежа);
• закрытие (когда истекает срок хранения объекта
NotifyTemplateEntryПоскольку операция чтения ничего не изменяет, то система не поддерживает уведомлений о чтениях. В листинге 20.4 приведен пример использования notify.
require 'rinda/tuplespace'ts = Rinda::TupleSpace.newalberts = ts.notify "write", ["Albert", nil]martins = ts.notify "take", ["Martin", nil]thr1 = Thread.new do alberts.each {|op,t| puts "#{op}: #{t.join(' ')}" }endthr2 = Thread.new do martins.each {|op,t| puts "#{op}: #{t.join(' ')}" }endsleep 1ts.write ["Martin", "Luther"]ts.write ["Albert", "Einstein"]ts.write ["Martin", "Fowler"]ts.write ["Alberf, "Schweitzer"]ts.write ["Martin", "Scorsese"]ts.take ["Martin", "Luther"]# Выводится:# write: Albert Einstein# write: Albert Schweitzer# take: Martin LutherМы видели, что
readniltem1 = ["X", Integer] # Соответствует ["X",5], но не ["X","Files"].tem2 = ["X", NilClass] # Соответствует литералу nil в кортеже.Кроме того, разрешается определять собственный оператор ветвящегося равенства (
======Время жизни кортежа можно задать в момент записи. В сочетании с величинами тайм-аутов для различных операций над кортежами это позволяет ограничить время выполнения простых и более сложных манипуляций.
Тот факт, что у кортежа может быть конечный срок хранения, заодно означает, что по истечении этого срока кортеж можно обновить с помощью специально написанного объекта. В библиотеке имеется готовый класс
SimpleRenewerВ листинге 20.5 приведен еще один пример работы с пространством кортежей. Он решает ту же задачу о производителе и потребителе, которая была рассмотрена в главе 13.
require 'rinda/tuplespace'ts = Rinda::TupleSpace.newproducer = Thread.new do item = 0 loop do sleep rand(0) puts "Производитель произвел ##{item}" ts.write ["Item",item] item += 1 endendconsumer = Thread.new do loop do sleep rand(0) tuple = ts.take ["Item", nil] word, item = tuple puts "Потребитель потребил ##{item}" endendsleep 60 # Работать одну минуту, потом завершиться и завершить потоки.20.4. Обнаружение сервисов в распределенном Ruby
Методика обнаружения сервисов может оказаться полезной, когда имеется много локально работающих сервисов, поскольку дает возможность находить сервис по имени. Если же число сервисов невелико и их местонахождение точно известно, особого смысла в автоматическом обнаружении нет.
Раз уж вы продолжили чтение, то, наверное, хотите знать, как работает механизм обнаружения сервисов. Такую возможность предоставляет библиотека
Rinda::Ringdrbdrb
