У меня очень многопоточное приложение, написанное на Ruby, которое разделяет несколько переменных экземпляра. Записи в эти переменные редки (1%), в то время как чтения очень распространены (99%). Каков наилучший способ (по вашему мнению или в идиоматическом стиле Ruby), чтобы эти потоки всегда видели самые современные значения? Вот некоторые идеи, которые у меня были (хотя Я хотел бы, чтобы вы внесли свой вклад до того, как я переделал это):
- Имейте блокировку, которую чаще всего используют перед чтением или записью любой из этих переменных (из Параллелизм Java на практике ). Недостатком этого является то, что он помещает в мой код много блоков
synchronize
, и я не вижу простого способа избежать этого.
- Используйте метод Ruby
freeze
(см. здесь ), хотя он выглядит столь же громоздким и не дает мне никаких преимуществ синхронизации, которые дает первый вариант.
Оба варианта кажутся довольно схожими, но, надеюсь, у кого-нибудь найдется лучшая идея (или она может хорошо отстаивать одну из этих идей). Я также согласился бы сделать объекты неизменяемыми, чтобы они не были повреждены или изменены во время операции, но я недостаточно хорошо знаю Ruby, чтобы сделать вызов самостоятельно и этот вопрос кажется, что объекты очень изменчивы.