考虑到某些情况,我想在Rails中每20秒执行一次后台操作。当击中某个 Controller 路线时,它开始了,看起来像这样

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 worker实例,将其指向相同的数据库,并使其执行与该线程具有相同功能的rake任务。现在一切正常。

最佳答案

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

ActiveRecord::Base.establish_connection Rails.env

10-04 18:34