5

ユーザーが送信したデータを処理する Web サービスがあります。ユーザーはそのデータに基づく応答を受け取る必要はなく、送信するだけで済みます。ただし、そのデータを処理する必要があります。現在、処理は post アクションへの応答として直接行われ、処理後に statuscode が返されます。これには通常 0.5 秒から 2 秒かかりますが、ユーザーが大量のデータを送信すると、それよりも長くかかることがあります。

Rails で、そのデータを処理するための新しいスレッドを生成し、ステータス コードを返す (したがって、ユーザーの要求を終了する) ことは可能ですか?

4

3 に答える 3

4

Resque、Delayed Job、または Sidekiq がニーズに合うはずです。

これら 3 つのリンクと、さらにいくつかのリンクがここにあります: https://www.ruby-toolbox.com/categories/Background_Jobs

于 2012-12-15T00:15:28.217 に答える
2

使用することもできますfork-これはエレガントなソリューションではありませんが、仕事を成し遂げ、余分な可動部分を導入しません. Rails アプリ全体で fork を実行するには (かなり面倒ですが、リクエストを処理する Rails アプリはすぐに応答します)、プロセスを切り離します。

class SomeController < ApplicationController
  def heavy_lifting
    process = fork do
      # calculate PI or process input
      # ...
      # sends the kill signal to current Process, which is the Rails App actually calculating PI
      Process.kill("HUP") 
    end
    Process.detach(process)
    # respond here
  end
end


処理/ジョブの実行に数メガのメモリしか必要としない場合forkでも、親プロセスと同じ量のメモリを割り当てることに注意してください。fork が一般的に行うことの概要を以下に示します。

更新 - スレッドと同じこと

class SomeController < ApplicationController
  def heavy_lifting
    Thread.new do
      # calculate PI or process input
      # ...
      Thread.kill
    end
    # respond here
  end
end
于 2012-12-15T13:48:40.833 に答える
2

resqueなどを使用して、バックグラウンドでデータを処理できると思います。

于 2012-12-14T23:34:44.377 に答える