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



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

现在我确实看到纤维和线程是完全不同的,因此它们的存储变量。谁能解释一下什么时候使用哪一种变量?

实际上我的理解如下:似乎两个请求永远不能同时在同一光纤/线程中服务。因此,如果我有一个值,我想把它放在请求范围内,任何一个都应该是好的。我的解释正确吗?

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

大量的ruby web服务器都不采用这两种方式——它们要么一次只服务一个客户端(如Webrick和Thin),要么使用进程来服务多个用户(如nginx上的passenger)。

然而,似乎有一个答案可以在这些情况下工作(多线程,多光纤,或多进程),感谢小实现的好处,如这篇博客文章所示:

Ruby线程本地也是光纤本地

我只是担心线程局部变量也不会光纤本地,因为光纤有自己的堆栈。这将是任何使用线程局部变量来分隔堆栈上下文,例如实现动态作用域变量或防止递归。然而,我的担心很容易就消除了。

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

最新更新