2

完了するまでに最大 30 秒かかる他の Web サイトからデータを取得する機能があります。ユーザーからの Web リクエストでこの関数を実行する必要がありますが、その時間を待たせたくありません。

現在、メソッドはビューコントローラー内から呼び出されます。

ユーザーを待たせるのではなく、自分の時間にそのメソッドを実行するにはどうすればよいですか?

4

2 に答える 2

1

ユーザーに表示する応答が長いプロセスの結果に依存しない場合は、メインのリクエストとは異なるスレッドでプロセスを実行するだけです。

あなたは確かにスティーブのアプローチを取り、処理キュー(delayed_job、sidekiq、resque)を使用することができますが、これはやり過ぎのように聞こえます。新しいサブプロセスをフォークしてデタッチするか、新しいスレッドをフォークするだけです。

pid = Process.fork do 
  long_process
end
Process.detach pid
于 2013-02-18T12:46:15.113 に答える
1

これらのリクエストを処理するバックグラウンドエージェントが必要です。私は最近、メッセージキューにbeaneater gemとbeanstalkdを使用して、このようなものを実装しました。私は神の宝石を使用してそのバックグラウンドプロセスを管理し、神のプロセスを管理するためのinitスクリプトを作成しました。ページ内のJavaScriptは、1.5秒ごとにAJAX呼び出しを行って、リクエストのステータスを照会し、リクエストが完了したときにユーザーに通知します。

その後、神がメモリリークを持っていることが知られていることを知りました。そのため、Bluepillの方が適している可能性があります。ちょうど今日、私はhttp://michaelvanrooijen.com/articles/2011/06/08-managing-and-monitoring-your-ruby-application-with-foreman-and-upstart/も見つけました。これは、バックグラウンドでのForemanとUpstartの使用について説明しています。プロセスであり、これはより単純で堅牢なアプローチのようです。次回このようなことをする必要があるときは、おそらくForeman / Upstart / beaneater/beanstalkdを試してみます。

さまざまな長所と短所から選択できるさまざまなメッセージキューがあることに注意してください。Beanstalkdは非常に応答性が高く、数分以内に実行されるプロセスに適しています。

于 2013-02-15T09:18:07.360 に答える