Ruby变量的安全性?

时间:2013-08-23 13:12:38

标签: ruby-on-rails ruby concurrency

这是一个非常基本的并发问题。

在Ruby中,可以安全地假设存储在局部变量中的任何状态都是线程安全的吗?

具体来说,我正在考虑Rails应用程序中的请求。如果我要在User类上存储状态,我认为这将要求并发问题。但是如果我在请求期间实例化一个用户(例如,Devise current_user方法,假设该方法不会在其下面使用全局用于它自己的状态),并且我从不将该用户分配给全局变量或常量,我应该可以修改该实例上的状态而不用担心线程安全,对吗?

1 个答案:

答案 0 :(得分:1)

基本上,你是对的,在一个请求中你可以安全地使用任何局部变量,除非你自己产生任何线程。

此外,如果您使用像Unicorn这样的服务器使用工作程序(单独的进程)来处理请求,那么您就是“线程安全”,因为每个进程都存在于自己的内存空间中,并且一次只处理一个请求。

如果您有像Puma这样的线程服务器可以在单个Ruby进程内并行处理多个请求,则可能会出现问题。这是竞争条件可能开始的地方,如果您有以下代码:

class User
  delf.self.current_user
    @@current_user
  end
end

User.current_user.destroy

并行进程可能会更改@@current_user变量,您可能会意外破坏错误的用户。