我有一個後臺操作,我想用Rails每20秒給出一些條件爲真發生線程不會影響數據庫。它拉開序幕,當某個控制器路由擊中,它看起來像這樣Rails的:除非加入到主線程
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沒有真正的線程,所以甚至有一次我得到了我的DB連接工作線程無法獲取處理器時間,除非有小到服務器的通信。
解決方法:啓動一個新的Heroku工人實例,在同一數據庫中指向它,並使它執行,具有相同功能的線程rake任務。現在一切都很好。
有更好的方法做後臺作業。想起[Resque](https://github.com/defunkt/resque)。 – pguardiario