Рубин - Неизменяемые объекты - PullRequest
8 голосов
/ 03 января 2009

У меня очень многопоточное приложение, написанное на Ruby, которое разделяет несколько переменных экземпляра. Записи в эти переменные редки (1%), в то время как чтения очень распространены (99%). Каков наилучший способ (по вашему мнению или в идиоматическом стиле Ruby), чтобы эти потоки всегда видели самые современные значения? Вот некоторые идеи, которые у меня были (хотя Я хотел бы, чтобы вы внесли свой вклад до того, как я переделал это):

  • Имейте блокировку, которую чаще всего используют перед чтением или записью любой из этих переменных (из Параллелизм Java на практике ). Недостатком этого является то, что он помещает в мой код много блоков synchronize, и я не вижу простого способа избежать этого.
  • Используйте метод Ruby freeze (см. здесь ), хотя он выглядит столь же громоздким и не дает мне никаких преимуществ синхронизации, которые дает первый вариант.

Оба варианта кажутся довольно схожими, но, надеюсь, у кого-нибудь найдется лучшая идея (или она может хорошо отстаивать одну из этих идей). Я также согласился бы сделать объекты неизменяемыми, чтобы они не были повреждены или изменены во время операции, но я недостаточно хорошо знаю Ruby, чтобы сделать вызов самостоятельно и этот вопрос кажется, что объекты очень изменчивы.

Ответы [ 4 ]

6 голосов
/ 03 января 2009

Использование блокировки - самый подходящий способ сделать это. Вы можете увидеть эту презентацию Джима Вейриха на тему: Что все рубиисты должны знать о потоках .

Кроме того, замораживание объекта здесь не поможет, поскольку вы хотите изменить эти переменные. Замораживание их означает, что никакие дальнейшие модификации не будут применимы к этим (и, следовательно, ваш 1% записей не будет работать).

1 голос
/ 03 апреля 2010

Я не использовал его сам, но вы можете проверить Поток данных . Все переменные записываются один раз.

0 голосов
/ 03 января 2009

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

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

0 голосов
/ 03 января 2009

Блокировка чтения-записи - распространенная проблема с четко определенным решением:

Блокировка чтения-записи

и есть много реализаций этого:

Запись шаблона блокировки

Вы не хотите устанавливать блокировку для каждого чтения / записи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...