【问题标题】:Instance variable in Rails for several requestRails 中用于多个请求的实例变量
【发布时间】:2014-05-08 08:30:21
【问题描述】:

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

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

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

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

如果 Bob 和 Alice 是同一个人,并且连续两次快速发出相同的请求怎么办?第一个请求会在其进程结束时看到第二个请求发起的值吗?

编辑:当config.cache_classes 设置为true 时会发生这种情况,根据我的实验,它与控制器的实例变量无关,但它确实与库有关。这是我所做的。当一个 http 请求到达时,我将一个实例变量@x 设置为一个随机值,并将它保存在一个变量x 中。我睡了一会儿,然后比较@x 和x。当我同时启动多个请求时,有时在进行比较时会发现不同的值。但是,这种不匹配不会发生在控制器中,但会发生在库中。这是否意味着控制器没有兑现但图书馆在config.cache_classes = true时?

【问题讨论】:

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


    【解决方案1】:
    1. @x 不是全局变量,而是实例变量。

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

    【讨论】:

    • 并且它们不应该在请求之间共享。
    • 显然是config.cache_classes = true
    • 不,控制器实例变量不共享。类实例变量可能是共享的,但我不会依赖它。
    【解决方案2】:

    Rails 4 是第一个默认为多线程的版本 - 除非您在配置中明确打开线程 (config.threadsafe!),否则您不应该遇到早期版本的可变并发问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2015-04-16
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多