2010-09-27 9 views
11

¿Alguien tiene una idea de por qué Google App Engine solo permite un único hilo de ejecución para una aplicación implementada?¿Por qué Google App Engine solo admite un único hilo de ejecución?

Personalmente creo que tiene algo que ver con la previsibilidad de una aplicación para que Google pueda dimensionar su rendimiento de manera más confiable. No parece haber ninguna razón de ser publicada en el sitio de Google con respecto a la ejecución de un solo hilo, por lo tanto, mi pregunta.

Tener una aplicación que ya tiene varios subprocesos y que actualmente se implementa en una VM significa que me es difícil moverme a la nube dada esta restricción.

EDIT: He marcado la respuesta a continuación, ya que parece bastante plausible que los hilos no estén permitidos debido a los requisitos de escala horizontal. Naturalmente, todos los subprocesos se ejecutan dentro del mismo espacio de proceso y, como GAE puede ejecutar muchos procesos para su aplicación, sería difícil compartir subprocesos. Dicho esto, todavía creo que un pequeño grupo de subprocesos por proceso sería útil y podría ayudar a migrar las aplicaciones a la nube. Lo solicitaré como una característica. Gracias por la discusión!

Respuesta

10

Hay una alternativa limitada a los hilos de desove en Google App Engine llamado colas de tareas: http://code.google.com/appengine/docs/python/taskqueue/

EDIT

De http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox:

Para permitir App Engine para distribuir solicitudes de aplicaciones a través de servidores web múltiples, y para evitar una aplicación de interferir con otro, la aplicación se ejecuta en un entorno restringido de "recinto de seguridad" . En este entorno, la aplicación puede ejecutar datos de código, almacenar y consulta en el almacén de datos de App Engine, utilizar el correo de App Engine , extracción de URL y los usuarios servicios, y examinar la solicitud web del usuario y preparar la respuesta.

Al igual que otras personas han señalado, las discusiones no son compatibles con motivo de valores a las aplicaciones de caja de arena.

Existen muchas otras restricciones dentro de Google App Engine que obligan a los desarrolladores a crear aplicaciones escalables. Creo que las colas de tareas son solo otra de estas restricciones porque, en lugar de crear un hilo en la máquina actual que maneja la solicitud HTTP, una tarea se coloca en una cola que luego puede programarse y ejecutarse en otras máquinas. Las colas de tareas permiten que el trabajo se comparta y distribuya entre las máquinas de una manera escalable.

+0

Las tareas son solo un nivel de abstracción más alto que la implementación de una cola compartida. Todavía estoy interesado en saber por qué los hilos no son compatibles directamente. –

+0

OK, esto suena bastante plausible, algo parecido a las consideraciones de escalado horizontal quizás ... cuanto más lo pienso, más sentido tiene. Sin embargo, no estoy tan seguro de que el problema de seguridad sea válido ... +1 para la respuesta de escala horizontal. –

+1

¿Cómo se relacionan los hilos de creación con la seguridad? El único aspecto de seguridad es matar un servidor al generar demasiados hilos. Todos los demás argumentos de seguridad son nulos, cualquier cosa que pueda hacer en un hilo lo puedo hacer igualmente bien en otro. Por supuesto, estoy hablando de tareas simples, y no de SETI. –

2

No estoy seguro, pero creo que es probablemente por razones de seguridad. Si permiten múltiples hilos, se están abriendo para una bomba fork() (o rosca equivalente). Además, simplifica en gran medida la administración de recursos. Google solo necesita administrar una sola cadena por valor de recursos por aplicación.

+0

creo que podría estar en lo cierto en lo que respecta a la gestión de recursos. Sin embargo, ya sea que permita solo un hilo o diez, aún puede administrar cosas a través de un grupo de hilos. –

3

Creo que esta es una pregunta engañosa. App Engine no permite que su aplicación genere subprocesos, pero el motor de la aplicación puede iniciar varias instancias de su aplicación o utilizar algún tipo de controlador de solicitudes multiproceso o con subprocesos. No conozco los detalles específicos, pero sin algún tipo de paralelismo, el motor de la aplicación sería una plataforma bastante inútil.

EDITAR

Mi respuesta original implícita incorrectamente que los hilos no son una característica útil, tienen muchos usos, pero la mayoría de los desarrolladores web no se las arreglan las discusiones dentro de sus aplicaciones. Los subprocesos generalmente se gestionan en niveles más bajos de la pila de aplicaciones.

+0

+1 También dadas las limitaciones de tiempo de cómputo (y las demandas de respuesta) que las aplicaciones deben cumplir, el valor de los subprocesos de desove será una sobrecarga adicional sin ningún beneficio. – msw

+1

Supongamos que ya se acepta que tener múltiples hilos en una aplicación es algo bueno. Por ejemplo, tengo aplicaciones que reciben una solicitud RESTful, la publican en una cola, tienen múltiples consumidores de esa cola, etc. Pueden entrar otros tipos de solicitudes en la cola, no solo de HTTP. –

+0

@Christopher Hunt, solo un porcentaje muy pequeño del programa de desarrolladores web a un nivel tan bajo, de hecho, ni siquiera es una opción para los desarrolladores de PHP. – mikerobi

6

App Engine utiliza un modelo de ejecución basado en solicitud, es decir, todo el trabajo tiene un alcance para una solicitud, ya sea un usuario o uno ingresado por otro sistema, como la cola de tareas. Si bien sería posible utilizar subprocesos en este entorno, la mayoría de los casos de uso en los que es útil el multithreading implican procesos de larga ejecución, para los cuales no está diseñado App Engine, o trabajo fuera de línea, en cuyo caso es mejor que utilizando las funciones escalables que App Engine proporciona, como la cola de tareas.

Dicho de otra manera, los hilos son una solución específica a un problema general. App Engine proporciona una alternativa para la mayoría de los casos de uso en forma de Task Queue.

+0

Gracias por la perspectiva adicional. Todavía no creo que esta sea la verdadera razón. GAE probablemente limita la cantidad de tiempo que su solicitud tiene para procesar de todos modos, y uno podría aplicar restricciones al tiempo de ejecución de los hilos en un grupo de subprocesos. Gracias sin embargo. –

+0

Podría, pero ¿por qué usaría un grupo de subprocesos en esa circunstancia? Tendría que comenzar uno nuevo para cada solicitud. –

0

Una nueva característica que se inicia desde que se formuló esta pregunta es background threads.

Mientras que los subprocesos normales se unen cuando finaliza una solicitud determinada (no pueden sobrevivir a las solicitudes), los subprocesos de fondo no tienen esta limitación.

Antecedentes enhebra

Código que se ejecuta en casos escala manual o básicos puede iniciar un hilo de fondo que puede sobrevivir a la solicitud de que se genera. Esto permite a las instancias realizar tareas periódicas o programadas arbitrarias o continuar trabajando en segundo plano después de que una solicitud haya regresado al usuario.

Código de ejemplo:

from google.appengine.api import background_thread 

# sample function to run in a background thread 
def change_val(arg): 
    global val 
    val = arg 

if auto: 
    # Start the new thread in one command 
    background_thread.start_new_background_thread(change_val, ['Cat']) 
else: 
    # create a new thread and start it 
    t = background_thread.BackgroundThread(
     target=change_val, args=['Cat']) 
    t.start()