いくつかの条件が真である場合、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 には真のスレッド化がないため、DB 接続が機能していても、サーバーへのトラフィックが少ない場合を除き、スレッドはプロセッサ時間を取得できませんでした。
解決策: 新しい Heroku ワーカー インスタンスを開始し、同じデータベースをポイントして、スレッドと同じ機能を持つ rake タスクを実行させます。今、すべてがうまく機能します。