2

いくつかの条件が真である場合、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 タスクを実行させます。今、すべてがうまく機能します。

4

1 に答える 1

3

データベース接続を再確立する必要があります。

ActiveRecord::Base.establish_connection Rails.env
于 2012-09-16T03:22:01.410 に答える