我有一个用 Ruby 编写的高度多线程的应用程序,它共享一些实例变量。写入这些变量的情况很少见 (1%),而读取很常见 (99%)。 确保这些线程始终看到所涉及的最新值的最佳方法是什么(无论是您认为还是惯用的 Ruby 方式)?这是我到目前为止的一些想法(虽然在我彻底修改之前我希望得到你的意见):
- 有一把锁,最常在读取或写入这些变量之前使用(来自 Java Concurrency in Practice )。这样做的缺点是它在我的代码中放置了很多
synchronize
block ,我没有找到避免它的简单方法。 - 使用 Ruby 的
freeze
方法(参见 here ),尽管它看起来同样麻烦并且没有给我任何第一个选项提供的同步优势。
这些选项看起来都非常相似,但希望那里的任何人都有更好的想法(或者可以为其中一个想法争论不休)。我也可以让对象不可变,这样它们就不会在操作过程中被破坏或改变,但我对 Ruby 的了解还不够深,无法自己和 this question 进行调用。似乎在争论对象是高度可变的。
最佳答案
使用锁是最合适的方法。您可以看到 Jim Weirich 关于这个主题的演讲:What All Rubyist Should Know About Threading .
此外,卡住对象在这里对您没有帮助,因为您要修改这些变量。将它们卡住到位意味着没有进一步的修改适用于这些(因此您的 1% 的写入将不起作用)。
关于Ruby - 不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/408208/