【Rails App】 應用服務器從Passenger切換爲Puma, Grape出現線程安全問題

Grape中的代碼以下:git

def market
    @market ||= Market.find(params[:id])
end

@market基於類層次的實例變量,屬於非線程安全,若是一直使用多線程服務器,可使用 Thread.current 代替:github

def market
    Thread.current[:market] ||= Market.find(params[:id])
end

若是考慮到之後哦使用其餘類型服務器,好比 Thin, 可使用 request_store gem 包,參考: https://github.com/steveklabnik/request_store安全

參考:
https://github.com/ruby-grape/grape-rabl/issues/37
https://ruby-china.org/topics/30188
https://stackoverflow.com/questions/9558192/thread-safety-class-variables-in-rubyruby

相關文章
相關標籤/搜索