光纤局部与线程局部变量

时间:2014-05-27 13:59:08

标签: ruby-on-rails ruby multithreading fibers

我很困惑何时在rails中使用光纤局部变量而不是线程局部变量。 我的用例如下:
我在rails中有一个控制器,它在GET请求中进行一些计算并将结果(这是一个整数列表)存储在光纤或线程局部变量中。我需要这样做,以便我可以超出这个计算结果,让我们说一个可能由控制器创建的模型。现在我不想将它存储在会话中,因为必须对每个GET请求进行此计算。我还在控制器中的GET方法完成之前清除了光纤/线程局部变量。

现在我确实看到Fiber和Thread都是完全不同的,因此它们的存储变量也是如此。任何人都可以解释何时使用哪种变量?

其实我的理解如下: 似乎两个请求永远不能同时在同一光纤/线程中提供。因此,如果我有一个我想要放入请求范围的值,那么任何一个都应该没问题。我的解释是否正确?

1 个答案:

答案 0 :(得分:3)

答案取决于您的网络服务器是否利用线程或光纤同时为多个用户提供服务。

令人惊讶的红宝石网络服务器数量都没有使用 - 它们或者一次只服务一个客户端(比如Webrick和Thin),或者使用进程来服务多个用户(比如nginx上的乘客)。

然而,似乎有一个答案适用于每种情况(多线程,多光纤或多进程),这要归功于小的实现优势,如blog post所示:

  

Ruby Thread Locals也是Fiber-Local

     

我简单地担心线程局部变量也不会   光纤本地,因为光纤有自己的堆栈。这将是一个   任何使用线程局部变量来分隔的代码的问题   堆栈上下文,例如实现动态范围的变量或   防止递归。然而,我的恐惧很容易消除。

     

再一次,Ruby得到了正确的东西。

底线 - 使用线程本地 - 它应该可以工作。