代码之家  ›  专栏  ›  技术社区  ›  Peter

在Rails中存储临时数据的位置

  •  0
  • Peter  · 技术社区  · 16 年前

    在Ruby中,我有一个控制器操作,它立即启动一个计算密集型任务,需要几秒钟。我希望客户端轮询我的服务器并获取状态更新。

    在我的控制器中:

    def complex_task
      Thread.new do
        loop do
          one_part_of_the_computationally_intensive_task
          # Note how much progress we've made, in case the client asks.
          save_progress
        end
      end
      # returns to client straightaway, but task continues in background.
    end
    
    def check_status
      # Retrieve state in here.
      get_progress
    end
    

    注意如何 check_status 需要拉动由单独线程存储的状态。

    我怎么写 save_progress get_progress 功能? 我在哪里存储州?把它放在里面似乎不是个好主意 session ,因为它被发送到客户机,但是我还要把它存储在哪里?

    (与 this question ,但更一般。我希望得到完全不同的答案。)

    2 回复  |  直到 16 年前
        1
  •  3
  •   Duncan Bayne    16 年前

    看一看 delayed_job . 您可以轻松地扩展此项,以便作业可以将进度写入 delayed_jobs 表,供后续提取 check_status() 方法(或者你甚至可以添加 set_status() 校验状态() 延迟工作…)

    请注意,延迟的工作最初是从Shopify中提取的;我猜这意味着它有一些坚实的现实世界的曝光。我宁愿从这样的基础开始,也不愿自己动手,除非我有一个非常令人信服的理由。

        2
  •  1
  •   Tim Sullivan    16 年前

    您可以将状态存储在模型中,并将状态标识放入会话中。或者,您可以使用数据库会话存储,而不是基于cookie的会话存储,这样可以以牺牲会话速度的代价将数据保存到服务器端的会话中。