2012-09-16 50 views
2

我有一個後臺操作,我想用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任務。現在一切都很好。

+0

有更好的方法做後臺作業。想起[Resque](https://github.com/defunkt/resque)。 – pguardiario

回答

3

您需要重新建立數據庫連接:

ActiveRecord::Base.establish_connection Rails.env 
+0

非常感謝您的快速回復!我在哪裏打電話給這個,這是什麼原因? –

+1

在新線程中,在開始寫入數據庫之前的某個位置。我不知道爲什麼有必要 - 我不得不用叉子這樣做,因爲連接不上之間進程共享的,我在你的情況下猜他們不是線程之間共享。 –

+0

哇,這很有趣。有什麼方法可以告訴它從我的database.yml中獲取數據庫配置,還是需要複製和粘貼? –