Rails:除非加入主线程,否则线程不会影响数据库

时间:2012-09-16 03:18:06

标签: ruby-on-rails ruby multithreading activerecord

我有一个后台操作,我想在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

但除非线程连接到主线程,否则模型不会保存到DB。为什么是这样?几个小时以来,我一直在讨论这个问题。

编辑:

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

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

1 个答案:

答案 0 :(得分:3)

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

ActiveRecord::Base.establish_connection Rails.env