考虑到某些情况,我想在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