Ruby on rails Ruby变量的线程安全性?
这是一个非常基本的并发问题 在Ruby中,假设存储在局部变量中的任何状态都是线程安全的,安全吗Ruby on rails Ruby变量的线程安全性?,ruby-on-rails,ruby,concurrency,Ruby On Rails,Ruby,Concurrency,这是一个非常基本的并发问题 在Ruby中,假设存储在局部变量中的任何状态都是线程安全的,安全吗 具体来说,我正在考虑Rails应用程序中的一个请求。如果我将状态存储在用户类上,我认为这会带来并发性问题。但是,如果我实例化一个用户(例如,在请求过程中designecurrent_user方法,假设该方法不使用全局变量作为其自身的状态),并且我从未将该用户分配给全局变量或常量,我应该能够修改该实例上的状态,而不考虑线程安全,对吗?基本上,您是对的,在单个请求中,您可以安全地使用任何局部变量,除非您自
具体来说,我正在考虑Rails应用程序中的一个请求。如果我将状态存储在用户类上,我认为这会带来并发性问题。但是,如果我实例化一个用户(例如,在请求过程中designe
current_user
方法,假设该方法不使用全局变量作为其自身的状态),并且我从未将该用户分配给全局变量或常量,我应该能够修改该实例上的状态,而不考虑线程安全,对吗?基本上,您是对的,在单个请求中,您可以安全地使用任何局部变量,除非您自己生成任何线程
此外,如果您使用服务器(如Unicorn)来使用工作进程(单独的进程)来处理请求,则您是“线程安全的”,因为每个进程都位于自己的内存空间中,并且一次只处理一个请求
如果您有一个像Puma这样的线程服务器,它可以在一个Ruby进程内并行处理多个请求,那么可能会出现问题。这是比赛条件可能开始的地方,如果您有如下代码:
class User
delf.self.current_user
@@current_user
end
end
User.current_user.destroy
@@current\u user
变量可能会被并行进程更改,您可能会意外地销毁错误的用户。我不确定是否应该指定Ruby实现;我知道他们对多线程的支持各不相同……即使您给出的示例在多进程(与多线程相反)模型中也是安全的,对吗?