2017-05-31 37 views
0

我對ruby相當陌生,想了解在多個並行請求情況下類實例變量的行爲。Sinatra多個並行請求變量行爲

我有控制器類中的方法,該方法被稱爲每次針對一個特定操作中的每個請求(建立在這種情況下)

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的意圖。

回答

1

你可以寫超簡單的腳本是這樣的:

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

get '/' do 
    Foo.bar 
end 

,你會看到它什麼也不做,因爲每一個電話,你創建(在你的代碼SchemaValidate)時間的新實例。

如果使用記憶化,並有這樣的事情@validator ||= SchemaValidate.new你將有存儲的請求之間SchemaValidate的一個實例。

我不認爲這會在性能方面的改變任何東西,我不知道爲什麼會有人做這樣的事情。

你可以有一些有趣的超簡單的腳本與西納特拉,以測試它的行爲。

祝您好運!

+0

我明白,每次我們創建一個新的時間實例,所以內存中的地址將是新的。我的問題是,在第一個傳入請求之後,測試點是a1的地址和第二個傳入請求之後是a2。如果第一個請求的代碼中的某處不應該測試指向a2(由第二個請求修改)而不是a1,因爲類實例varibale將在每個類的實例之間共享。 – madcolonel10