Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby变量的线程安全性?_Ruby On Rails_Ruby_Concurrency - Fatal编程技术网

Ruby on rails Ruby变量的线程安全性?

Ruby on rails Ruby变量的线程安全性?,ruby-on-rails,ruby,concurrency,Ruby On Rails,Ruby,Concurrency,这是一个非常基本的并发问题 在Ruby中,假设存储在局部变量中的任何状态都是线程安全的,安全吗 具体来说,我正在考虑Rails应用程序中的一个请求。如果我将状态存储在用户类上,我认为这会带来并发性问题。但是,如果我实例化一个用户(例如,在请求过程中designecurrent_user方法,假设该方法不使用全局变量作为其自身的状态),并且我从未将该用户分配给全局变量或常量,我应该能够修改该实例上的状态,而不考虑线程安全,对吗?基本上,您是对的,在单个请求中,您可以安全地使用任何局部变量,除非您自

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

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


具体来说,我正在考虑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实现;我知道他们对多线程的支持各不相同……即使您给出的示例在多进程(与多线程相反)模型中也是安全的,对吗?