4

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

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

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

4

1 回答 1

3

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

数量惊人的 ruby​​ 网络服务器两者都没有使用——它们要么一次只服务一个客户端(如 Webrick 和 Thin),要么使用进程服务多个用户(如通过 nginx 的乘客)。

然而,由于小的实现支持,似乎有一个适用于每种情况(多线程、多光纤或多进程)的答案,如这篇文所示:

Ruby Thread Locals 也是 Fiber-Local

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

再一次,Ruby 把小事做对了。

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

于 2014-05-27T15:19:05.790 回答