Чтение онлайн

на главную

Жанры

Программирование на языке Ruby
Шрифт:

Здесь уместно будет сказать несколько слов о синхронизации. Предположим, что два клиента пытаются одновременно забрать (

take
) один и тот же кортеж. Одному это удастся, а другой будет заблокирован. Если первый клиент затем изменит кортеж и запишет (
write
) его обратно в хранилище, то второй получит модифицированную версию. Можно считать, что операция «обновления» — это последовательность
take
и
write
, которая не приводит к потере данных. Конечно, как и при любом варианте многопоточного программирования, нужно позаботиться о том, чтобы не возникали тупиковые ситуации.

Метод

notify
позволяет следить за пространством кортежей и получать уведомления, когда над интересующим вас кортежем была выполнена какая-то операция. Этот метод возвращает объект
NotifyTemplateEntry
и может наблюдать на операциями четырех видов:

• 

write
;

• 

take
;

• удаление (когда истекает срок хранения кортежа);

• закрытие (когда истекает срок хранения объекта

NotifyTemplateEntry
).

Поскольку операция чтения ничего не изменяет, то система не поддерживает уведомлений о чтениях. В листинге 20.4 приведен пример использования notify.

Листинг 20.4. Уведомление в системе Rinda

require 'rinda/tuplespace'

ts = Rinda::TupleSpace.new

alberts = ts.notify "write", ["Albert", nil]

martins = ts.notify "take", ["Martin", nil]

thr1 = Thread.new do

 alberts.each {|op,t| puts "#{op}: #{t.join(' ')}" }

end

thr2 = Thread.new do

 martins.each {|op,t| puts "#{op}: #{t.join(' ')}" }

end

sleep 1

ts.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

Мы видели, что

read
и другие операции пользуются шаблонами для сопоставления с образцами (и этим напоминают регулярные выражения). Мы уже знаем, что
nil
выступает в роли метасимвола, но можно указать и класс; ему будет соответствовать любой экземпляр этого класса.

tem1 = ["X", Integer] # Соответствует ["X",5], но не ["X","Files"].

tem2 = ["X", NilClass] # Соответствует литералу nil в кортеже.

Кроме того, разрешается определять собственный оператор ветвящегося равенства (

===
), если вы хотите проводить сопоставление особым способом. В противном случае для сравнения будет использован стандартный оператор
===
.

Время жизни кортежа можно задать в момент записи. В сочетании с величинами тайм-аутов для различных операций над кортежами это позволяет ограничить время выполнения простых и более сложных манипуляций.

Тот факт, что у кортежа может быть конечный срок хранения, заодно означает, что по истечении этого срока кортеж можно обновить с помощью специально написанного объекта. В библиотеке имеется готовый класс

SimpleRenewer
, который каждые 180 секунд обращается к drb-серверу, создавшему кортеж. Если сервер не отвечает, то кортеж удаляется. Но не пытайтесь программировать обновление, пока не освоитесь с парадигмой пространства кортежей.

В листинге 20.5 приведен еще один пример работы с пространством кортежей. Он решает ту же задачу о производителе и потребителе, которая была рассмотрена в главе 13.

Листинг 20.5. Задача о производителе и потребителе

require 'rinda/tuplespace'

ts = Rinda::TupleSpace.new

producer = Thread.new do

 item = 0

 loop do

sleep rand(0)

puts "Производитель произвел ##{item}"

ts.write ["Item",item]

item += 1

 end

end

consumer = Thread.new do

 loop do

sleep rand(0)

tuple = ts.take ["Item", nil]

word, item = tuple

puts "Потребитель потребил ##{item}"

 end

end

sleep 60 # Работать одну минуту, потом завершиться и завершить потоки.

20.4. Обнаружение сервисов в распределенном Ruby

Методика обнаружения сервисов может оказаться полезной, когда имеется много локально работающих сервисов, поскольку дает возможность находить сервис по имени. Если же число сервисов невелико и их местонахождение точно известно, особого смысла в автоматическом обнаружении нет.

Раз уж вы продолжили чтение, то, наверное, хотите знать, как работает механизм обнаружения сервисов. Такую возможность предоставляет библиотека

Rinda::Ring
(естественно, основанная на системе Rinda). В чем-то она похожа на службу DNS; это центральная служба регистрации, где хранится информация (в виде пространства кортежей) о
drb
– процессах. Сервисы
drb
могут по протоколу UDP найти ближайший сервер регистрации, объявить о своем присутствии или найти другие работающие поблизости сервисы.

Поделиться:
Популярные книги

Голубой бриллиант (Сборник)

Шевцов Иван Михайлович
Проза:
современная проза
4.50
рейтинг книги
Голубой бриллиант (Сборник)

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Братья Карамазовы

Достоевский Федор Михайлович
Проза:
классическая проза
русская классическая проза
9.24
рейтинг книги
Братья Карамазовы

Аврора Горелика (сборник)

Аксенов Василий Павлович
Поэзия:
драматургия
6.25
рейтинг книги
Аврора Горелика (сборник)

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Лишённые плоти

Макдермид Вэл
6. Тони Хилл и Кэрол Джордан
Детективы:
маньяки
7.71
рейтинг книги
Лишённые плоти

"Самая страшная книга-4". Компиляция. Книги 1-16

Коллектив авторов
Самая страшная книга
Фантастика:
городское фэнтези
мистика
ужасы и мистика
5.00
рейтинг книги
Самая страшная книга-4. Компиляция. Книги 1-16

Год 1942 — «учебный»

Бешанов Владимир Васильевич
Документальная литература:
биографии и мемуары
6.20
рейтинг книги
Год 1942 — «учебный»

Газлайтер. Том 40

Володин Григорий Григорьевич
40. История Телепата
Фантастика:
альтернативная история
аниме
попаданцы
6.25
рейтинг книги
Газлайтер. Том 40

Я снова царь. Книга XXXIII

Дрейк Сириус
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова царь. Книга XXXIII

Мясной Бор

Гагарин Станислав Семенович
Проза:
военная проза
историческая проза
7.50
рейтинг книги
Мясной Бор

Эстетика

Бычков Виктор Васильевич
Научно-образовательная:
философия
5.00
рейтинг книги
Эстетика

Рыцарь Империи

Буревой Андрей
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
Рыцарь Империи

Скрытая Империя

Андерсон Кевин Джей
1. Сага Семи Солнц
Фантастика:
научная фантастика
6.25
рейтинг книги
Скрытая Империя