2017-05-31 9 views
0

私はかなり新しいですが、複数の並列要求の場合のクラスインスタンス変数の振る舞いを理解したいと思います。Sinatra複数の並列要求変数の振る舞い

Iの特定の操作のための要求ごとに毎回呼び出され私のコントローラクラス内のメソッド(この場合は作成)

class DeployProvision 
    def self.create(data) 
     raise "Input JSON not received." unless data 
     # $logger.info input_data.inspect 
     failure = false 
     response_result = "" 
     response_status = "200" 
     @validator = SchemaValidate.new 
     validation = @validator.validate_create_workflow(data.to_json) 
    end 
end 

この方法は、(DeployProvision.create(データ))と呼ばれる持って

複数のリクエストが来たときに、@validatorクラスのインスタンス変数がどのように動作するか少し混乱します。それは複数の要求の間で共有されていますか?これをローカル変数ではなくクラスインスタンス変数として宣言することをお勧めしますか?

私は既存のコードベースに取り組んでおり、ローカル変数ではなくクラスインスタンス変数として@validatorを作成する意図を理解したいと考えています。

require 'sinatra' 
class Foo 
    def self.bar 
    @test = Time.now 
    puts @test 
    end 
end 

get '/' do 
    Foo.bar 
end 

を、あなたはすべての呼び出しで、あなたは(あなたのコード内のschemaValidate)時間の新しいインスタンスを作成しているので、それは、何もしません表示されます:

答えて

1

あなたはこのように、超簡単なスクリプトを書くことができます。

memoizationを使用していて、@validator ||= SchemaValidate.newのようなものを使用していた場合、リクエスト間に1つのSchemaValidateインスタンスが格納されます。

私はパフォーマンスに関して何かを変えるとは思っていません。なぜ誰かがそのようなことをしているのか分かりません。

sinatraを使って非常に簡単なスクリプトで楽しく遊んで、動作をテストできます。

このコードで幸運を祈る!

+0

私は、Timeの新しいインスタンスを作成するたびに、メモリ内のアドレスが新しいことを理解しています。私の質問は、最初の着信要求の後、テストポイントがa1であり、2回目の着信要求後にa2であることを示します。最初のリクエストのコードのどこかに、クラスインスタンスとしてa1ではなくa2のテストポイントがa2(2番目のリクエストによって変更されている)になってはならない場合、varibaleはクラスのすべてのインスタンスで共有されます。 – madcolonel10

関連する問題