这是一个非常基本的并发问题。
在Ruby中,可以安全地假设存储在局部变量中的任何状态都是线程安全的吗?
具体来说,我正在考虑Rails应用程序中的请求。如果我要在User类上存储状态,我认为这将要求并发问题。但是如果我在请求期间实例化一个用户(例如,Devise current_user
方法,假设该方法不会在其下面使用全局用于它自己的状态),并且我从不将该用户分配给全局变量或常量,我应该可以修改该实例上的状态而不用担心线程安全,对吗?
答案 0 :(得分:1)
基本上,你是对的,在一个请求中你可以安全地使用任何局部变量,除非你自己产生任何线程。
此外,如果您使用像Unicorn这样的服务器使用工作程序(单独的进程)来处理请求,那么您就是“线程安全”,因为每个进程都存在于自己的内存空间中,并且一次只处理一个请求。
如果您有像Puma这样的线程服务器可以在单个Ruby进程内并行处理多个请求,则可能会出现问题。这是竞争条件可能开始的地方,如果您有以下代码:
class User
delf.self.current_user
@@current_user
end
end
User.current_user.destroy
并行进程可能会更改@@current_user
变量,您可能会意外破坏错误的用户。