我有一个后台操作,我想在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任务。现在一切都很好。
答案 0 :(得分:3)
您需要重新建立数据库连接:
ActiveRecord::Base.establish_connection Rails.env