Rails Thread.current []和线程安全

Eas*_*yCo 2 ruby ruby-on-rails thread-safety

我就是这样,对吧.只是看一些代码,突然研究点点滴滴,我的眼受体被陌生人攻击了.我像:

什么!!!这就是全部!

无论如何,我看到的是(来源):

def authenticate_user!
  if doorkeeper_token
    Thread.current[:current_user] = User.find(doorkeeper_token.resource_owner_id)
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

所以看了一会儿之后,想一想:

Wtf是这种Thread.current[]疯狂吗?这甚至是必要的吗?它甚至试图做什么?

在我看来,这有点像向后戴棒球帽:你可能看起来很酷,但太阳眩光正在赢.然后我决定到谷歌周围,阅读一些文章和一些SO.

似乎没有简洁地回答我的问题:鉴于代码的上下文,它是否与以下内容不同:

def authenticate_user!
  if doorkeeper_token
    @current_user = User.find(doorkeeper_token.resource_owner_id)
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

如果没有,那么什么情况/场景有用/防范?

我希望你喜欢我的故事,并希望贡献一个令人敬畏的结局.

7st*_*tud 5

您可以使用不同的公告板来固定信息.local variables被张贴的公告牌隐藏在树篱后面,居住在下一个院子里的景色无法看到:

current_user = User.find(doorkeeper_token.resource_owner_id)
Run Code Online (Sandbox Code Playgroud)

@variables张贴的公告板钉在梯子的顶部,因此视图在树篱的顶部有一个无阻碍的@variables视图:

@current_user = User.find(doorkeeper_token.resource_owner_id)
Run Code Online (Sandbox Code Playgroud)

但是其他方法,住在街对面的课堂上,看不到@variables发布在梯子顶部的公告牌上,因为一排树正在挡路.

Thread variables, 如:

Thread.current[:current_user] = User.find(doorkeeper_token.resource_owner_id)
Run Code Online (Sandbox Code Playgroud)

发射一只比树高的风筝,放在风筝上的变量可以通过街对面的方法看出来.

为什么不创建一个ruby global variable,例如$ current_user?因为不同用户同时发起的请求将写入相同的全局变量,可能会搞砸了.

鉴于代码的上下文

没有足够的上下文来说明为什么需要(线程)全局变量.