Correr rake middleware
en una aplicación básica rieles dicta la siguiente:
use Rack::Lock
use ActionController::Failsafe
use ActionController::Reloader
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActiveRecord::SessionStore, #<Proc:[email protected](eval):8>
use ActionController::RewindableInput
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
run ActionController::Dispatcher.new
El primer elemento de la pila de rack es Rack::Lock
. Esto pone un candado alrededor de cada solicitud, por lo que solo se maneja una solicitud a la vez. Como tal, estándar rails es de rosca simple. Sin embargo, puede engendrar nuevos hilos dentro de una solicitud que haría que su aplicación tenga varios hilos, la mayoría de la gente nunca se encuentra con esto.
Si usted está teniendo problemas ...
require 'thread'
Thread.exclusive do
# stuff here
end
... aseguraría que las cosas dentro del bloque no se ejecuta en paralelo con cualquier otra código.Creando un Mutext
compartido entre todos los hilos (en una variable de clase o algo así, pero esto podría borrarse cuando se recarga en modo dev, así que ten cuidado), y bloquearlo como Rack::Lock#call
es preferible si solo quieres asegurarte de que no haya dos instancias del mismo código se ejecuta al mismo tiempo.
Además, para el registro, cada solicitud crea y desreferencia un controlador en cada ciclo de solicitud. No hay dos solicitudes que vean la misma instancia, aunque pueden ver la misma clase.
Configuración config.threadsafe!
vacíos casi todo lo que dije. Eso elimina Rack::Lock
de la pila, y significa que tendrá que establecer un mutex manualmente para evitar la doble entrada. No lo hagas a menos que tengas una buena razón.
Incluso sin Rack::Lock
, seguirá recibiendo una instancia de controlador por solicitud. El punto de entrada a su controlador asegura que, notice the call to new
in process
.
Podría abordar la respuesta de cwa y esta afirmación en las preguntas frecuentes de Mongrel, "Mientras Rails se está ejecutando, solo hay un controlador en funcionamiento a la vez". ¿Qué significa eso, en funcionamiento al mismo tiempo ... que varios hilos pasan a través de una sola instancia como servlets de Java? –
Por cierto, terminé sincronizándome en un semáforo Mutex por lo que mi código es seguro, sin duda, pero me gustaría entender esto de todos modos. Gracias por su respuesta ... –
Rails es de rosca simple. Cada solicitud obtiene su propia instancia de controlador, y solo se maneja un hilo a la vez. – cwninja