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

sno*_*ard 5 ruby multithreading ruby-on-rails fibers

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

现在我确实看到 Fiber 和 Thread 有很大不同,因此它们的存储变量也有很大不同。谁能解释一下何时使用哪种变量?

实际上我的理解如下:似乎两个请求永远不能同时在同一个纤程/线程中得到服务。因此,如果我想将一个值放入请求范围中,那么任何一个都可以。我的解释正确吗?

Uri*_*ssi 4

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

令人惊讶的是,数量惊人的 ruby​​ Web 服务器都没有使用这两种方法 - 它们要么一次只为一个客户端提供服务(如 Webrick 和 Thin),要么使用进程为多个用户提供服务(如 nginx 上的乘客)。

然而,由于实现上的一些小好处,似乎有一个适用于每种情况(多线程、多光纤或多进程)的答案,如本博客文章所示:

Ruby 线程局部变量也是光纤局部变量

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

Ruby 再一次把小事情做好了。

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