質問

が、新たな資源が必要であ 長尺加工 前の資源は、どうやって送る処理離れ その背景 がで はなげ 現在のリクエストまたはその他の交通の自分のウェブ-アプリ?

私のモデル

class User < ActiveRecord::Base
 after_save :background_check

 protected
 def background_check
  # check through a list of 10000000000001 mil different
  # databases that takes approx one hour :)
  if( check_for_record_in_www( self.username ) )
    # code that is run after the 1 hour process is finished.
    user.update_attribute( :has_record )
  end
 end
end
役に立ちましたか?

解決

きていたことから名前をとって、以下のRailscasts:

その説明の実行方法の背景過程のレールでのやり方ではなく、キュー...)

他のヒント

開始別のプロセスすることで、最も容易な方法は、 system,prepending a'nohup"を追加する'&'の末尾にコマンドに渡します。(ただし、コマンドを一つだけの文字列の引数ではなく、リストの引数になります。)

その理由はいくつかありますがいこくえを利用することにしたのだろうスレッド:

  1. Rubyのスレッドできるのが少々難でやっていI/O;に介護していることもあんなプロセス全体をブロックです。

  2. 行った場合、プログラムの別名ですが容易に認識でに'ps'だけを記載うでしFastCGI後も野生のやっていたのに.nekoです。

本当に、この処理を開始すべき"deamonizedみての Daemonize クラス。

それはHerokuのホスティングプラットフォームで動作するので、私は単に「delayed_job」宝石の実験をしてきた、それはセットアップが途方もなく簡単でした!

Gemfileに宝石を追加し、bundle installrails g delayed_jobrake db:migrate その後にキュー・ハンドラを起動します。

RAILS_ENV=production script/delayed_job start

あなたは長いプロセスすなわちあるメソッド呼び出しを持っている場合は、

company.send_mail_to_all_users

;

あなたはそれを変更します

company.delay.send_mail_to_all_users

githubの上の完全なドキュメントを確認してください: https://github.com/collectiveidea/delayed_jobする

あなたは、理想的ではなく、あなた自身を書くよりも、既存のバックグラウンドジョブサーバを使用したいです。これらは通常、あなたが仕事を提出し、それに固有のキーを与えるようになります。あなたはその後、定期的にWebアプリケーションをブロックすることなく、あなたのジョブの状態のためのジョブサーバを照会するためにキーを使用することができます。 ここにありますそこに様々なオプションの素敵な検挙するます。

私はbackgroundrb使用するように、その素敵なそれはあなたが長いプロセスの間にそれに通信することができます。あなたはレールのアプリでステータス更新を持つことができますので、

私は、バックグラウンドで何らかの処理を行う、産卵には、あなたのプロセスをフォークするための素晴らしい方法だと思う、とショーのユーザー、この処理が開始されたことを単にいくつか確認ます。

はどうます:

def background_check
   exec("script/runner check_for_record_in_www.rb #{self.username}") if fork == nil
end

プログラム「check_for_record_in_www.rbは」データベースにアクセスできること、その後、別のプロセスで実行され、ActiveRecordのにアクセスできるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top