Ações do controlador Rails seguras por thread - definindo variáveis ​​de instância?

Eu tenho que escrever um aplicativo Rails threaded porque eu estou executando-o em cima de Neo4j.rb, que incorpora um banco de dados gráfico Neo4j dentro do processo Rails, e, portanto, eu tenho que servir várias solicitações do mesmo processo. Sim, seria legal se conectar a um banco de dados Neo4j funcionasse como bancos de dados SQL, mas isso não acontece, então eu vou parar de reclamar e apenas usá-lo.

Estou bastante preocupado com as implicações de escrever código concorrente (como eu deveria ser), e só preciso de alguns conselhos sobre como lidar com um cenário comum - um controlador define uma variável de instância ou uma variável no hash de sessão, então algumas coisas acontece. Considere o seguinte código bruto para demonstrar o que quero dizer:

# THIS IS NOT REAL PRODUCTION CODE
# I don't do this in real life, it is just to help me ask my question, I
# know about one-way hashing, etc.!

class SessionsController
  def create
    user = User.find_by_email_and_password(params[:email], params[:password])
    raise 'auth error' unless user
    session[:current_user_id] = user.id
    redirect_to :controller => 'current_user', :action => 'show'
  end
end

class CurrentUserController
  def show
    @current_user = User.find(session[:current_user_id])
    render :action => :show # .html.erb file that uses @current_user
  end
end

A pergunta: há alguma condição de corrida neste código?

Em SessionsController, são ossession hash e oparams hash thread-local? Digamos que a mesma sessão do navegador faça várias solicitações para / sessions # create (para usar a sintaxe da rota do Rails) com credenciais diferentes, o usuário que efetuou login deve ser a solicitação que atingiu a linhasession[:current_user_id] = user.id último? Ou devo envolver um bloqueio mutex em torno da ação do controlador?

No CurrentUserController, se a ação show for atingida simultaneamente por duas solicitações com sessões diferentes, a mesma variável @current_user será definida por ambas? Ou seja A primeira requisição, como está processando o arquivo .html.erb, descobre que a variável de instância @current_user foi subitamente alterada pelo segundo thread?

obrigado

questionAnswers(2)

yourAnswerToTheQuestion