13

数秒ごとにコードを実行する方法を見つけようとしている ruby​​ on rails アプリがあります。

cron または cron のような実装を使用して多くの情報とアイデアを見つけましたが、これらは分単位まで正確であり、外部ツールが必要です。タスクを 15 秒ごとに開始し、アプリケーション内で完全に自己完結させたい (アプリが停止した場合、タスクが停止し、外部セットアップがない場合)。

これは、キャッシュ データのバックグラウンド生成に使用されています。数秒ごとに、タスクはいくつかのデータを収集し、すべてのクライアント リクエストで使用されるキャッシュに保存します。このタスクは非常に遅いため、クライアントの要求をブロックせずにバックグラウンドで実行する必要があります。

私はRubyにはかなり慣れていませんが、強力なperlのバックグラウンドを持っています。これを解決する方法は、フォークしてコードを実行し、完了したら終了するインターバルタイマーとハンドラーを作成することです。
クライアントのリクエストをシミュレートして、Rails コントローラー自体を fork にする方が良いかもしれません。このようにして、タスクの URI をヒットすることでタスクを開始できます (ただし、タスクは数秒ごとに実行されるため、必要になるとは思えませんが、将来使用される可能性があります)。ただし、定期的なタスクスケジューラによって呼び出されているメソッドをコントローラーに呼び出すだけでも簡単です(一度取得したら)。

4

7 に答える 7

13

いつでも宝石をお勧めします https://github.com/javan/whenever

次のようなスケジュールを指定できます。

every 15.minutes do
  MyClass.do_stuff
end

cron ジョブをスケジュールしたり、外部サービスをモンキーしたりする必要はありません。

于 2012-11-13T01:10:48.163 に答える
2

独自のメソッドを作成することもできます。

class MyWorker
  def self.work
    #do you work
    sleep 15
  end
end

で実行するrails runner MyWorker.work バックグラウンドで実行されている別のプロセスがあります

または、Resqueのようなものを使用することもできますが、それは別のアプローチです。それはそのように機能します:何かがキューにタスクを追加し、その間にワーカーはキューにあるすべてのジョブをフェッチし、それを終了しようとします。

だからそれはあなた自身の必要性に依存します。

于 2012-11-13T04:01:01.547 に答える
2

一般的に言えば、アプリケーション内で定期的なタスクを作成するための組み込みの方法はありません。Rails は Rack 上に構築されており、http リクエストを受信し、何かを実行してから戻ることを想定しています。したがって、定期的なタスクを外部で管理するだけです。

タスクを実行する必要がある頻度を考えると、まともな解決策は、Foreman のようなものを使用して、永久にループする単純な rake タスクを自分で作成し、アプリケーションを起動すると同時にそれを開始することです。Foreman は、アプリと共にバックグラウンド ワーカーの起動/シャットダウンを管理するために、このようによく使用されます。本番環境では、Monit など、別のものを使用してプロセスを管理したい場合があります。

于 2012-11-13T03:27:07.057 に答える
0

遅延ジョブのようなものを使用し、頻繁に再キューイングしますか?

于 2012-11-12T23:28:31.307 に答える