Muszę napisać gwintowaną aplikację Rails, ponieważ uruchamiam ją na szczycie Neo4j.rb, która osadza bazę danych wykresu Neo4j wewnątrz procesu Railsowego, i dlatego muszę obsługiwać wiele żądań z tego samego procesu. Tak, byłoby fajnie, gdyby połączenie z bazą danych Neo4j działało jak bazy danych SQL, ale tak nie jest, więc przestanę narzekać i po prostu z niego korzystać.Działania kontrolerów wątków bezpieczne Railsy - ustawianie zmiennych instancji?
Jestem dość zaniepokojony konsekwencjami pisania współbieżnego kodu (tak jak powinienem być) i potrzebuję tylko porady, jak radzić sobie z typowym scenariuszem - kontroler ustawia zmienną instancji lub zmienną w haszy sesji , a potem coś się dzieje. Rozważ poniższy surowy kod, aby pokazać, co mam na myśli:
# 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
Pytanie: Czy w tym kodzie są jakieś warunki wyścigu?
W SessionsController, czy mieszanie session
i mieszanie params
wątku są lokalne? Powiedzmy, że ta sama sesja przeglądarki wysyła wiele żądań do/sessions # create (aby wypożyczyć składnię trasy Railsów) z różnymi referencjami, zalogowany użytkownik powinien być ostatnim zapytaniem, które trafiło na linię session[:current_user_id] = user.id
? Czy powinienem owinąć blokadę mutex wokół akcji kontrolera?
W kontrolerze CurrentUserController, jeśli akcja pokazu jest trafiona jednocześnie przez dwa żądania z różnymi sesjami, czy ta sama zmienna @current_user będzie ustawiona przez obie? To znaczy. czy pierwsze żądanie, przetwarzając plik .html.erb, wykryje, że zmienna instancji @ current_user została nagle zmieniona przez drugi wątek?
Dzięki
To jest stara nitka, przepraszam. Ale mam śledzenie. To ma sens (i dlaczego ludzie nie martwią się o zmienne @ w metodach kontrolera, ale jeśli to prawda, jestem zdezorientowany tym, jak ten facet miał problemy z kontem http://tenderlovemaking.com/2012/ 06/18/removing-config-threadsafe.html –
@OliverShaw w tym liczniku postów jest zmienną instancji klasy (ponieważ znajduje się w bloku 'class << self'), więc wszystkie żądania będą modyfikować ten sam licznik. –
powrót do Ruby. Zapamiętałem zmienne klasy, ale nie zmienne instancji klasy.Dzięki! –