Rails中的实例变量用于多个请求

时间:2014-05-08 08:30:22

标签: ruby-on-rails ruby httprequest multiple-instances

我有一个用于Web应用程序的Ruby on Rails服务器。

我想知道Ruby中的实例变量是否在不同的请求上共享。这是我的问题:

Bob向我的ruby服务器发出Get请求;它首先启动一个实例变量@x,然后处理它的请求一段时间。

与此同时,Alice发出了另一个启动实例变量@x的Get请求。 在Bob的过程结束时,查看变量@x。它是否具有Bob或Alice给出的价值?

如果Bob和Alice是连续两次快速提出相同请求的同一个人怎么办?第一个请求是否会在其进程结束时看到第二个请求启动的值?

修改:当config.cache_classes设置为true时会发生这种情况,而在我的实验中,它并不涉及控制器'实例变量,但它确实涉及图书馆。这就是我所做的。当http请求到达时,我将实例变量@x设置为随机值并将其保存在变量x中。我睡了一会然后比较@xx。当我同时发出多个请求时,我有时会在进行比较时找到不同的值。然而,这种不匹配并不是在控制器中发生的,而是在图书馆中发生的。这是否意味着控制器没有兑现,但是库存时间是config.cache_classes = true

2 个答案:

答案 0 :(得分:3)

  1. @x不是全局变量,而是实例变量。

  2. 不,请求之间不共享控制器实例变量。

答案 1 :(得分:3)

Rails 4是默认情况下第一个多线程版本 - 除非您在配置中明确启用了线程,否则不应遇到早期版本的变量并发问题。{/ p>

您仍然可以在单线程Rails中遇到与数据库相关的并发问题:例如,如果您在请求开始时从字段中读取,请对该值执行一些计算,然后将其写回。

在多线程Rails中,您也可能遇到全局变量或类变量的并发问题,因为它们存储在共享内存空间中。全局变量用美元符号config.threadsafe!定义,类变量用符号$x定义两个 - 两者都有它们的用途,但通常有更好的方法来传递数据。