SyncEm: Thread-Safe Decorators in Ruby

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

我之前写过一些关于面向对象编程中线程安全性的文章,以及如何通过装饰器实现线程安全性。还有人说过,确保对象在Ruby和Java中是线程安全的非常重要,尤其是在Web应用程序中,这些应用程序是多线程的(在大多数情况下)。好吧,这里有一个叫做SyncEm的原始Ruby宝石,它只需要一个装饰器就可以实现上述功能。

看看这个简单的Ruby Web应用程序,每次Web点击都会增加内部计数器的值:

为了计算访问次数,它使用Visits类,可以这样定义(它将计数器保存在一个文件中):

它不是线程安全的。尝试运行这个应用程序,你会发现,如果你同时对首页发起多个HTTP请求,计数器不会总是返回连续的数字。

要使其线程安全,你可以使用SyncEm(https://github.com/yegor256/syncem),这是我几个月前刚刚创建的一个小型Ruby宝石。以下是具体步骤:

在这里,我们只是使用一个线程安全的装饰器对对象进行修饰,该装饰器拦截对象的所有方法调用,并使用一个封装的信号量使它们都同步。

这个机制只在Ruby或类似的解释型语言中有效。在Java或C++中无法做到同样的效果。但是在Ruby、Python、PHP、JavaScript和许多其他语言中,类似的装饰器可能非常有用。

例如,我在这个网络应用中使用它。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:02

sixnines availability badge   GitHub stars