Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 光纤局部变量与线程局部变量_Ruby On Rails_Ruby_Multithreading_Fibers - Fatal编程技术网

Ruby on rails 光纤局部变量与线程局部变量

Ruby on rails 光纤局部变量与线程局部变量,ruby-on-rails,ruby,multithreading,fibers,Ruby On Rails,Ruby,Multithreading,Fibers,我对在rails中何时使用光纤局部变量而不是线程局部变量感到非常困惑。 我的用例如下: 我在rails中有一个控制器,它根据GET请求执行一些计算,并将结果(一个整数列表)存储在fiber或thread局部变量中。我需要这样做,这样我就可以在控制器创建的模型中超过这个计算结果。现在我不想将它存储在会话中,因为必须对每个GET请求进行计算。在控制器中的GET方法完成之前,我还清除了fiber/thread局部变量 现在我确实看到光纤和线程都有很大的不同,因此它们的存储变量也不同。有人能解释一下什么

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

现在我确实看到光纤和线程都有很大的不同,因此它们的存储变量也不同。有人能解释一下什么时候使用哪种变量吗

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

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

令人惊讶的是,大量ruby web服务器都没有利用这两种功能——它们要么一次只为一个客户机服务(如Webrick和Thin),要么使用进程为多个用户服务(如nginx上的passenger)

然而,由于实施方面的小优势,似乎有一个答案在这些情况下(多线程、多光纤或多进程)都适用,如下所示:

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

Ruby再一次把小事情做好了


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

您不只是想要一些值吗?我看不出线程或光纤在这里有什么关系。查看我的链接,您可以只使用
Rails.cache.write
Rails.cache.read
。简单的缓存在这里没有帮助,因为每次调用GET方法时,我都需要一个新的预计算值,该值将仅用于该请求。如果我使用Rails.cache,它将是一种全局缓存,而不是特定于某个请求。那么,如果只使用了一次,那么只需将值从控制器传递到视图?就像在您的控制器中
@view\u value=…
和在您的视图中使用
@view\u value
?我是不是又误会了:)?是的:),这是一段有点复杂的遗留代码,我无法直接将值从控制器传递到模型。所以,看起来线程本地或光纤本地可能是有效的选项,但不确定使用哪一个?嗯。。。在我看来,两个请求永远不可能在同一光纤/线程中同时提供。因此,如果我有一个我想放在请求范围中的值,任何一个都可以。我的解释正确吗?