2012-07-12 9 views
15

? Estoy un poco confundido acerca de cómo Go maneja las solicitudes concurrentes en Google App Engine. Así que espero que alguien pueda darme algo de claridad.¿Cómo maneja Go la solicitud simultánea en Google App Engine

Éstos son los hechos que he recogido:

  1. Go es el único subproceso en App Engine. - this is because it is possible to do arbitrary pointer arithmetic by creating race conditions with multiple threads

  2. Goroutines are multiplexed onto multiple OS threads so if one should block, such as while waiting for I/O, others continue to run.

  3. [App Engine has a] 10 concurrent limit [which] is enforced through a limit on concurrent threads on every runtime. Most of such cases, our scheduler will try to spin up a new instance.

Si Go es un solo subproceso en App Engine entonces el punto 3 se discutible. Esto deja 1 y 2. Si Go on App Engine tiene un único subproceso y se requieren subprocesos para continuar la ejecución mientras se bloquea para E/S, parece que una instancia de App Engine Go bloqueará todas las rutinas mientras espera en E/S.

Es esto correcto? De lo contrario, ¿cómo funciona la concurrencia de Go en App Engine?

Para ayudar a cuantificar las cosas. Si tuviera que mantener una conexión abierta durante 30 segundos. ¿Cómo pueden mantener conexiones simultáneas una sola instancia de AE ​​Go?

Gracias.

EDIT: aquí está la solicitud de una función que permitirá a Go Instancia manejar más entonces 10 solicitudes simultáneas Allow configurable limit of concurrent requests per instance. Por favor estrella.

+7

Configurar GOMAXPROCS = 1 (eso es lo que hace GAE) solo significa que siempre habrá exactamente un hilo activo que ejecute las rutinas. Es posible que aún tenga un par de hilos bloqueados (no cuentan). También tenga en cuenta que la biblioteca Go usa epoll en segundo plano, por lo que es poco probable que I/O bloquee un hilo completo (pero hay otras formas de bloquear un hilo en Go). Sin embargo, no sé nada sobre el límite general de 10 hilos en GAE. – tux21b

+1

El límite de solicitud concurrente ahora es configurable (hasta un máximo de 80), vea http://stackoverflow.com/a/37364981/943833 – Roganartu

Respuesta

21

Una instancia de Go App Engine permite 10 solicitudes concurrentes, pero solo ejecuta un subproceso de CPU. En efecto, se pueden procesar múltiples solicitudes al mismo tiempo, pero solo una podrá realizar tareas de CPU a la vez. Si una solicitud es, por ejemplo, esperar que se devuelva una llamada a la API del almacén de datos, la misma instancia puede procesar otra solicitud.

Su declaración "Si Go tiene una sola hebra en App Engine, entonces el punto 3 es discutible". Es incorrecto. Todavía hay un límite de 10 solicitudes concurrentes en vuelo para una sola instancia de Go App Engine. La documentación está un poco suelta con las palabras cuando habla de "hilos".

+3

** Esta respuesta necesita una propagación mucho mayor. ** Comprendo que el tiempo de ejecución de Go pone en cola las solicitudes, de modo que una solicitud entrante debería esperar hasta que la solicitud actual haya sido procesada por completo. Era obvio que una sola solicitud podía engendrar muchas rutinas y operar al mismo tiempo, pero no tantas rutinas podrían hacerlo. – mjibson

+0

Los documentos sí dicen "múltiples solicitudes pueden ser manejadas simultáneamente por una instancia determinada", pero nunca llegué tan lejos a través del párrafo hasta que lo releí justo ahora, habiéndome detenido en la limitación de un único subproceso. – mjibson

+0

Gracias David. Todavía estoy un poco confuso sobre la solicitud de regulación. Tomé [la respuesta de Takashi aquí] (http://stackoverflow.com/a/11443482/236564) para indicar que todas las instancias estaban limitadas por 10 subprocesos concurrentes en lugar de solicitudes. Parece que esto puede haber cambiado recientemente. ¿Eso no es verdad para Go? Si se trata de hilos, ¿cuál sería un límite práctico para el número de solicitudes concurrentes que podría manejar una instancia de F1 Go? –

4

Debo admitir que no tengo ningún conocimiento interno de AppEngine. Todo esto es especulación y adivinación, pero creo que es algo razonable.

Tu aplicación nunca alcanzará el límite de diez hilos. Esto se debe a que hay muy pocas razones para crear subprocesos. Primero, el número máximo de goroutines que se ejecutan a la vez se establece en uno a enforce memory safety. En segundo lugar, a diferencia de un programa normal, el motor de aplicaciones no necesita realizar llamadas de sistema. La única vez que lo hace es para establecer una red. Todo IO en appengine se puede muxar en un subproceso epoll. Esto significa que todo lo que necesita son dos hilos en un momento dado. A continuación, puede agregar una tercera o cuarta secuencia en caso de que de vez en cuando necesite ejecutar otras llamadas de sistema como asignación de memoria y aceptación/cierre de conexiones. Estas son llamadas rápidas de sistema que bloquean durante un tiempo muy pequeño. Incluso con estas otras llamadas de sistema, todavía está muy lejos del límite de diez subprocesos.

La simultaneidad no se ve afectada porque, al final, todo lo que hace en appengine se reduce a esperar que vuelva algo a través de la red. No necesita múltiples hilos para hacer muchas cosas a la vez.

+0

Gracias Stephen que fue muy útil. –

+0

@KyleFinley, si no estás muy familiarizado con esas "cosas epoll", recomiendo mucho al menos hojear el clásico ["The C10K problem"] (http://www.kegel.com/c10k.html) trabajo . – kostix

+0

@kostix Artículo interesante. Gracias. –