我有一个用于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
中。我睡了一会然后比较@x
和x
。当我同时发出多个请求时,我有时会在进行比较时找到不同的值。然而,这种不匹配并不是在控制器中发生的,而是在图书馆中发生的。这是否意味着控制器没有兑现,但是库存时间是config.cache_classes = true
?
答案 0 :(得分:3)
@x
不是全局变量,而是实例变量。
不,请求之间不共享控制器实例变量。
答案 1 :(得分:3)
Rails 4是默认情况下第一个多线程版本 - 除非您在配置中明确启用了线程,否则不应遇到早期版本的变量并发问题。{/ p>
您仍然可以在单线程Rails中遇到与数据库相关的并发问题:例如,如果您在请求开始时从字段中读取,请对该值执行一些计算,然后将其写回。
在多线程Rails中,您也可能遇到全局变量或类变量的并发问题,因为它们存储在共享内存空间中。全局变量用美元符号config.threadsafe!
定义,类变量用符号$x
定义两个 - 两者都有它们的用途,但通常有更好的方法来传递数据。