1

単一プロセスの Rack アプリケーションがあるとします。複数の要求が同時に到着した場合、呼び出しはcall(env)同時に発生しますか? それとも、call(env)連続して発生することが保証されているため、競合状態はありません@counterか? Unicorn と Thin の使用に違いはありますか?

require 'json'

class Greeter
  def call(env)
    req = Rack::Request.new(env)
    @counter ||= 0
    @counter = @counter + 1
    puts @counter
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]]
  end
end

run Greeter.new
4

1 に答える 1

1

ラックハンドラー(アプリケーションサーバー)によって異なります。UnicornとThinはどちらも、選択したモデルと構成方法に応じて、マルチプロセスモデルやイベントモデルを使用して同時リクエストを実行できます。したがって、同時実行を担当するのはハンドラー(Unicorn、Thin、またはその他)であるため、Rackがそれをサポートするかどうかは実際には問題ではありません。この投稿には、いくつかの一般的なRackアプリサーバーの詳細と概要が記載されています。

Sinatraはマルチスレッドですか?

クラス内のインスタンス変数がスレッド間で共有される可能性があるかどうか疑問に思っている場合Greeterは、同時アプリサーバーの1つを使用している場合でも、それぞれが独自のGreeterインスタンスを持ち、したがって個別のインスタンス変数を持っているため、そうなることはありません。ただし、グローバルまたは定数はすべてのスレッドで共有されるため、これらを考慮してロック/ミューテックスなどを使用する必要があるため、注意する必要があります

于 2013-03-20T07:19:57.027 に答える