鉴于某些条件为真,我希望在 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 任务。现在一切都很好。