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)
如果没有,那么什么情况/场景有用/防范?
我希望你喜欢我的故事,并希望贡献一个令人敬畏的结局.
您可以使用不同的公告板来固定信息.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?因为不同用户同时发起的请求将写入相同的全局变量,可能会搞砸了.
鉴于代码的上下文
没有足够的上下文来说明为什么需要(线程)全局变量.
| 归档时间: |
|
| 查看次数: |
998 次 |
| 最近记录: |