2

鉴于某些条件为真,我希望在 Rails 中每 20 秒执行一次后台操作。它在某个控制器路由被击中时启动,它看起来像这样

def startProcess
    argId = self.id
    t = Thread.new do
        while (Argument.isRunning(argId)) do
            Argument.update(argId)
            Argument.markVotes(argId)
            puts "Thread ran"
            sleep 20
        end
    end
end

但是,除非我调用此代码,否则此代码对我的数据库绝对没有任何作用,"t.join"在这种情况下,我的整个服务器被阻塞了很长时间(但它可以工作)。

为什么不加入主线程就不能读取提交 ActiveRecords?线程调用看起来像的方法

def sample
  model = Model.new()
  model.save()
end

但除非线程加入主线程,否则模型不会保存到数据库中。为什么是这样?几个小时以来,我一直在为此头疼。

编辑:

标记为正确的答案在技术上是正确的,但是此编辑是为了概述我最终使用的解决方案。问题是 Ruby 没有真正的线程,所以即使我的数据库连接正常工作,除非服务器的流量很少,否则线程无法获得处理器时间。

解决方案:启动一个新的 Heroku worker 实例,将其指向同一个数据库,并使其执行与线程具有相同功能的 rake 任务。现在一切都很好。

4

1 回答 1

3

您需要重新建立数据库连接:

ActiveRecord::Base.establish_connection Rails.env
于 2012-09-16T03:22:01.410 回答