2009-05-22 19 views
28

新しいリソースが作成され、それが現在の要求または他のを保持しない場所それはいくつかの長い処理を行う必要があるリソースの準備が整う前に、どのように私は離れて背景にその処理をお送りくださいされている場合私のウェブアプリケーションへのトラフィック?私のモデルでRuby on Rails:バックグラウンドでの実行方法

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 

答えて

39

あなたは間違いなく、次のRailscastsをチェックアウトする必要があります:

彼らはすべての可能でRailsの中にバックグラウンド・プロセスを実行する方法を説明しますway(aqの有無にかかわらず) ueue ...)

+2

これらの日、最もよく使用される/最高のサポートされているオプションは、[sidekiq](https://github.com/mperham/sidekiq)されている、[resque ](https://github.com/defunkt/resque)、[delayed_job](https://github.com/collectiveidea/delayed_job)を参照してください。 IMHO、Sidekiqはハイスループットのキューには最適ですが、delayed_jobはスループットが非常に低い場合に最適です。 –

+0

バックグラウンド処理を「サービスとして」行い、サーバーやキューイングの考え方を心配する必要がない場合は、[IronWorker](http://www.iron.io)を選択することもできます。 IronMQ/IronWorkerは、自動再試行、タスクログ、ウェブフックなども提供しています。これはRailsとうまく統合されています。いくつかの動画は次のとおりです:https://www.youtube.com/user/ironiodevelopers – Chad

7

は「nohupを」を先頭に追加し、あなたがそれを渡すコマンドの最後に「&」を付加、おそらく最も簡単systemで行われている別のプロセスを起動します。 (コマンドは、ちょうど1つの文字列引数ではなく引数のリストであることを確認してください)

いくつかのあなたは、このようにそれをやりたいな理由ではなく、たとえば、スレッドを使用しようとしているがあります。

  1. は、

    Rubyのスレッドは、I/Oを実行する際に少しトリッキーになる可能性があります。あなたがしていることによってプロセス全体がブロックされないように注意する必要があります。

  2. 異なる名前のプログラムを実行すると、 'ps'で簡単に識別できるので、誤ってFastCGIバックエンドがワイルドなものになってしまったと誤って判断してしまうことはありません。

実際に開始するプロセスは「無効化」する必要があります。Daemonizeクラスを参照してください。

2

自分で作成するのではなく、既存のバックグラウンドジョブサーバーを使用するのが理想です。これらは通常、あなたが仕事を提出させ、それに独特の鍵を与えることができます。そのキーを使用して、Webアプリケーションをブロックすることなくジョブサーバーに定期的にジョブのステータスを問い合わせることができます。 here is a nice roundupのさまざまなオプションがあります。

0

何について:

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のにアクセスする必要があります。

1

私はbackgroundrbを使いたいのですが、それはあなたが長いプロセスの間にそれと通信することができます。だから、あなたのレールアプリで状態の更新をすることができます

1

私はspawnあなたのプロセスをフォークし、バックグラウンドでいくつかの処理を行い、この処理が開始されたことを確認するちょっとした確認をするのに最適な方法だと思います。

6

私は 'delayed_job'の宝石を試してきました。なぜなら、それはHerokuホスティングプラットフォームで動作していて、セットアップが面倒だったからです!

gemfileにgemを追加するには、bundle installrails g delayed_jobrake db:migrate 次にキューハンドラを起動します。あなたは、あなたがそれを変更

company.send_mail_to_all_users 

すなわち、あなたの時間のかかるプロセスであるメソッド呼び出しを持っている

RAILS_ENV=production script/delayed_job start 

company.delay.send_mail_to_all_users 

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

関連する問題