光纤局部变量 vs 线程局部变量

5
我在使用rails时很困惑何时应该使用Fiber局部变量而不是Thread局部变量。
我的用例如下:
我有一个控制器,当接收到GET请求时会进行一些计算,并将结果(整数列表)存储在Fiber或Thread局部变量中。我需要这样做,以便我可以在模型中访问此计算结果,该模型可能由控制器创建。现在我不想将其存储在session中,因为必须对每个GET请求进行计算。我还清除了在控制器完成GET方法之前的Fiber/Thread局部变量。
现在我看到Fiber和Thread是非常不同的,因此它们的存储变量也不同。请问有谁能解释何时使用哪种类型的变量?
实际上,我的理解如下:
似乎两个请求不能同时在同一个Fiber/Thread中服务。因此,如果我有一个要放在请求范围内的值,任何一种都可以。我的解释正确吗?

你是不是想要缓存一些值?我不明白线程或者纤程在这里有什么关联。看看我的链接,你可以直接使用Rails.cache.writeRails.cache.read - Daniël Knippers
简单的缓存在这里是不太有用的,因为对于每次调用GET方法,我需要一个新的预计算值,该值仅在该请求中使用。如果我使用Rails.cache,它将成为一种全局缓存,而不是特定于请求的缓存。 - snow_leopard
哦,如果只使用一次,那么从控制器将值传递给视图就可以了吗?比如在你的控制器中写上 @view_value = ...,然后在视图中使用 @view_value?我又理解错了吗 :)? - Daniël Knippers
是的 :), 这是一段有点复杂的遗留代码,我无法直接从控制器传递值到模型。因此,似乎 Thread Local 或 Fiber Local 可能是有效的选项,但不确定该使用哪一个? - snow_leopard
1个回答

4
答案取决于您的Web服务器是否使用线程或纤程来同时为多个用户提供服务。
令人惊讶的是,许多Ruby Web服务器都不使用任何一种方式 - 它们一次只为一个客户提供服务(例如Webrick和Thin),或者使用进程为多个用户提供服务(例如通过nginx的乘客)。
然而,似乎有一个答案可以在每种情况下都起作用(多线程,多纤程或多进程),这要归功于小型实现喜好,如此博客文章所示:
Ruby线程本地变量也是Fiber-Local
我曾经担心线程本地变量不会也是Fiber-local,因为纤程有自己的堆栈。对于使用线程本地变量来界定堆栈上下文的任何代码,例如实现动态作用域变量或防止递归,这将是一个问题。然而,我的恐惧很容易消除。
再次证明,Ruby做到了小事情。
底线-使用线程本地变量-它应该有效。

嗯...在我看来,两个请求似乎永远不能在同一纤维/线程中同时处理。因此,如果我有一个要放入请求范围的值,任何一个都可以。我的解释正确吗? - snow_leopard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接