0

作成時に、一連の FTP サーバーから定期的にデータを自動的にスクレイピングするクラスを持つライブラリがあります。これはスレッド化されており、「results」メソッドを呼び出すだけでこれまでの結果を確認できます。私はレールにかなり慣れていませんが、このオブジェクトの Web インターフェイスを作成して、結果を確認し、開始し、停止し、基本的にオブジェクト全般とやり取りできるようにしたいと考えました。バックグラウンドで実行してデータを収集できるように、誰かが Web インターフェイスを使用しているかどうかに関係なく、最初に作成してそのままにしておく必要があります。また、開始/停止/情報ページを作成できるように、コントローラーからアクセスできるようにしたいと考えています。これを達成するための最良の方法についてのアイデアはありますか?

PS私はRails 3.2.3とRuby 1.9.3を実行しています

4

4 に答える 4

2

バックグラウンド プロセスを実行して Rails アプリからアクセスするより良い方法がありますが、質問に直接答える方法は次のとおりです。

イニシャライザに入れるだけです。/config/initializers ディレクトリがあります。そこに .rb ファイルを配置すると、Rails アプリの起動時に自動的に実行されます。

/config/initializers/hello.rb:

Rails.logger.debug "Hello World"

Rails サーバーを起動すると、「Hello World」が表示されます。

クラスのインスタンスをグローバルに利用可能にするには、グローバル変数を作成するだけです:

MYCLASS = MyClass.new
于 2012-05-09T21:20:04.507 に答える
0

うーん。これは Linux ボックスで実行されていますか?

もしそうなら、簡単にデーモンを書くことができ、オプションでシステムの起動時にデーモンを起動させることができます。データとおそらくその現在の状態 (実行中/オフ) を、ある種のメモリ ストア (Memcache? Redis) またはデータベースに入れます。コントローラーはそこからデータにアクセスします。

/etc/init.d/my_service stop/start/restartコントローラーに直接のようなことをさせることもできます。

これらの小さなデーモンを多数実行し、異なるマシンで実行する (または管理する) 可能性がある場合は、それらの状態を管理し、RabbitMQ などを介して通信するアプリを作成することをお勧めしますが、それはやり過ぎかもしれません。あなたがしたい。

于 2012-05-09T21:31:38.357 に答える
0

Redis と Resque は、Rails アプリと共に必要なものです。

レディス: http://redis.io/

レスキュー: https://github.com/defunkt/resque

Redis はキャッシング サーバーであり、resque はその上に構築されたジョブ スケジューリング ツールです。Resque には、Resque と連携して動作をカスタマイズおよび拡張できる拡張機能が多数あります。例えば:

Resque には、すべてのジョブとキューのステータスを追跡できる Web UI も付属しています。

したがって、基本的には、ジョブを起動したり、実行中のジョブの完了または進行状況を監視したりできるページを作成して、アプリを構築します。

すべてのジョブは「ワーカー」サーバーで実行され、Rails アプリで何が起こるかは独立しています。すべての進行状況データは redis に保存されるため、Rails アプリが再起動すると、再起動時に redis に接続するだけで最新のデータが得られます。

このすべてのインフラストラクチャは、Heroku でも「Redis-to-Go」アドオンを使用して非常にうまく機能します。現在、多くのタスクに使用していますが、うまく機能しています。

于 2012-05-09T21:39:01.590 に答える
0

Rails アプリケーション内でスレッドを作成するべきではありません。これは厄介で危険です。Rails は単一のプロセスではなく、Passenger などのランチャー フレームワークによって多数のプロセスが作成されるため、各プロセスでこのオブジェクトのインスタンスを作成する必要があり、これは労力が重複する可能性があります。

より良いアプローチは、バックグラウンドで実行される単一のプロセスを持つことですが、さまざまな Rails インスタンスで使用できる何らかの API を公開します。これを行う 1 つの方法は、Memcached、Redis、従来のデータベース、さらにはフラット ファイルなどのシステムを共有ストレージ システムとして使用することです。もう 1 つの方法は、Rails で使用できるインターフェイスを公開して、API 呼び出しに直接応答することです。「memcached を話す」プロセスを作成することはそれほど難しくありません。

一般的に最も簡単な方法は、共有ストレージを使用して作業を完了することです。使い方は簡単で、プロセスが正しい結果を生成しているかどうかを調べるのはさらに簡単です。たとえば、ActiveRecord を使用してスクレイピングの結果をデータベースに保存し、これらの同じモデルを使用してアプリケーション内でデータを取得します。

Rails アプリケーションに組み込むのは、この共有データにアクセスするためのある種のラッパーです。これは、一連の ActiveRecord モデル、いくつかの Memcached 呼び出し、またはその他のものである可能性がありますが、最終的な結果は、N 個のプロセスで独立して実行できるクリーンなインターフェイスになります。

于 2012-05-09T21:20:45.993 に答える