thread rails parallel multithreaded asp.net ruby-on-rails multithreading concurrency

asp.net - rails - ruby multithreaded



¿De qué manera NO es multiproceso Ruby on Rails? (3)

Dado que se trata de "de ASP.NET a RoR", hay otro detalle pequeño pero importante para recordar: en los entornos * nix es común lograr la concurrencia de una aplicación de servicio a través de multiprocesamiento en lugar de multiproceso. Esta es una arquitectura que se remonta al pasado y está relacionada con el costo relativamente bajo del multiprocesamiento en sistemas * nix utilizando fork y Copy-on-Write . Cada proceso sirve una solicitud a la vez en un solo subproceso y el proceso principal controla la generación y eliminación de los procesos hijos de los trabajadores. Múltiples solicitudes son atendidas concurrentemente por diferentes procesos secundarios.

Las aplicaciones de servicio modernas, por ejemplo, Apache, tienen modos multiproceso, multiproceso e incluso combinados (donde el servicio bifurca varios procesos, cada uno ejecutando varios subprocesos).

En los casos en los que la aplicación se diseñó teniendo en cuenta la portabilidad (nuevamente ejemplos: Apache, MySQL, etc.), es habitual ejecutarla en modo multiproceso o combinado en sistemas * nix, y en modo multihilo en servidores Windows.

Sin embargo, hay que reconocer que Rails carece de algo en el frente de Windows. No es que no pueda ejecutarlo en Windows, es solo que no se hizo un gran esfuerzo para asegurarse de que funcione bien y sin problemas para el uso de producción en servidores Windows. No es una plataforma de producción común entre la comunidad RoR.

Como resultado, Eventhough Rails es seguro para subprocesos desde la versión 2.2, aún no hay un buen servidor de subprocesos múltiples para este en servidores Windows. Y obtiene los mejores resultados al ejecutarlo en servidores * nix utilizando el modelo de concurrencia de múltiples procesos / subproceso único.

Descargo de responsabilidad : soy un desarrollador ac # ASP.NET que aprende "RoR". Lo siento si esta pregunta no "recibe" RoR, ¡cualquier corrección es muy apreciada!

¿Qué es multihilo?

Mi comprensión de la capacidad de "subprocesos múltiples" en aplicaciones web es doble:

  1. Cada vez que un servidor web / de aplicaciones recibe una solicitud, puede asignar un subproceso a la nueva solicitud, por lo que se pueden ejecutar varias solicitudes simultáneamente.
  2. La aplicación runtime + language permite utilizar múltiples subprocesos DENTRO de una sola solicitud (en ASP.NET mediante métodos y palabras clave "Async", por ejemplo ).

De esta manera, IIS7 + ASP.NET puede hacer los puntos 1 y 2.

Estoy confundido acerca de RoR

He leído estos dos artículos y me han dejado confundido:

pregunta uno.

Creo que entiendo que RoR no se presta muy bien al punto número 2 anterior, es decir, al tener varios subprocesos dentro de la misma solicitud, ¿lo he entendido?

pregunta dos

Para que quede claro, los servidores de aplicaciones / web de RoR también pueden hacer el punto número 1 arriba (¿es posible que se puedan ejecutar varias solicitudes a la vez)? ¿No es ese el caso de RoR?


Rieles como marco es seguro para subprocesos. Entonces, la respuesta es si!

El segundo enlace que publicó aquí nombra a muchos de los servidores de Rails que no funcionan bien con multihilo. Más tarde menciona que nginx es el camino a seguir (definitivamente es el más popular y altamente recomendado). Pero no menciona lo que le hizo llegar a las conclusiones. Ruby 1.9.3 salió recientemente y tiene una nueva calidad de subprocesamiento incorporada que no existía antes.

El uso de subprocesos múltiples generalmente depende del caso de uso. Personalmente, lo probé una vez hace un año y funcionó, pero no lo he usado en ningún código de producción porque no he encontrado un caso de uso en el que el uso de subprocesos múltiples tuviera más sentido que llevar la tarea de ejecución prolongada a un trabajo de fondo

Me encantaría explorar esto más. Entonces, si puede describir lo que está tratando de lograr, entonces tal vez podamos hacer un POC.


Pregunta 1: Si lo desea, puede generar más hilos de Ruby en una solicitud, aunque eso parece estar fuera del caso de uso típico de Rails. Existen usos para ciertas operaciones de E / S de larga ejecución o para operaciones externas.

Pregunta 2: El factor limitante para la concurrencia de Ruby en general, no solo con Rails, es el Global Interpreter Lock . Esta característica de Ruby evita que más de 1 subproceso de Ruby se ejecute en un momento dado por proceso. El bloqueo se libera siempre que se ejecuta un código que no sea de Ruby, como esperar las respuestas de IO o SQL del disco. Puede solucionar esto utilizando una implementación de Ruby diferente a la predeterminada, como JRuby, pero no todas.

Phusion Passenger utiliza la concurrencia basada en procesos para manejar algunas solicitudes al mismo tiempo, por lo que, estrictamente hablando, no es "multiproceso", sino que es concurrente.

Esta charla de Ruby MidWest 2011 tiene algunos buenos pensamientos sobre cómo poner en marcha Ruby on Rails de múltiples hilos.