Ruby on Rails:どのように行うのです。
-
23-08-2019 - |
質問
が、新たな資源が必要であ 長尺加工 前の資源は、どうやって送る処理離れ その背景 がで はなげ 現在のリクエストまたはその他の交通の自分のウェブ-アプリ?
私のモデル
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:
- http://railscasts.com/episodes/127-rake-in-background
- http://railscasts.com/episodes/128-starling-and-workling
- http://railscasts.com/episodes/129-custom-daemon
- http://railscasts.com/episodes/366-sidekiq
その説明の実行方法の背景過程のレールでのやり方ではなく、キュー...)
他のヒント
開始別のプロセスすることで、最も容易な方法は、 system
,prepending a'nohup"を追加する'&'の末尾にコマンドに渡します。(ただし、コマンドを一つだけの文字列の引数ではなく、リストの引数になります。)
その理由はいくつかありますがいこくえを利用することにしたのだろうスレッド:
Rubyのスレッドできるのが少々難でやっていI/O;に介護していることもあんなプロセス全体をブロックです。
行った場合、プログラムの別名ですが容易に認識でに'ps'だけを記載うでしFastCGI後も野生のやっていたのに.nekoです。
本当に、この処理を開始すべき"deamonizedみての Daemonize クラス。
それはHerokuのホスティングプラットフォームで動作するので、私は単に「delayed_job」宝石の実験をしてきた、それはセットアップが途方もなく簡単でした!
Gemfileに宝石を追加し、bundle install
、rails g delayed_job
、rake 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のにアクセスできるようになります。