Ruby - 不可变对象
-
03-07-2019 - |
题
我有一个用 Ruby 编写的高度多线程应用程序,它共享一些实例变量。对这些变量的写入很少见 (1%),而读取则非常常见 (99%)。 确保这些线程始终看到所涉及的最新值的最佳方法是什么(无论是您认为的还是惯用的 Ruby 方式)? 到目前为止,我有一些想法(尽管在彻底修改之前我希望得到您的意见):
- 在读取或写入任何这些变量(来自 Java 并发实践)。这样做的缺点是它会花费很多
synchronize
我的代码中存在块,但我没有找到避免它的简单方法。 - 使用 Ruby 的
freeze
方法(参见 这里),尽管它看起来同样麻烦,并且没有给我带来第一个选项所带来的任何同步好处。
这些选项看起来都非常相似,但希望任何人都会有更好的想法(或者可以很好地支持其中一个想法)。我也可以让对象不可变,这样它们就不会在操作过程中被损坏或改变,但我对 Ruby 的了解还不够深,无法自己进行调用, 这个问题 似乎认为对象是高度可变的。
解决方案
使用锁是最合适的方法。您可以查看 Jim Weirich 就该主题所做的演讲: 所有 Rubyist 都应该了解的关于线程的知识.
此外,冻结对象在这里不会有帮助,因为您想要修改这些变量。将它们冻结到位意味着 没有进一步的修改将适用于这些 (因此你的 1% 的写入将不起作用)。
不隶属于 StackOverflow