2012-06-25 10 views
9

Estaba jugando con el paquete HTTP go. Quise procesar la solicitud en paralelo como lo hago en Java. Pero no pude.¿Cómo procesar la solicitud HTTP paralela en el lenguaje de programación go?

Creé un servidor web simple, me quedé dormido en el medio y me di cuenta de que debía procesar una solicitud por vez, así que si hice una actualización en mi navegador, el proceso de la primera solicitud debe terminar hasta la segunda solicitud iniciar el procesamiento, aquí está el código:

func main(){ 

    //Process the http commands 
    fmt.Printf("Starting http Server ... ") 
    http.Handle("/", http.HandlerFunc(sayHello)) 
    err := http.ListenAndServe("0.0.0.0:8080", nil) 
    if err != nil { 
     fmt.Printf("ListenAndServe Error",err) 
    } 
} 

func sayHello(c http.ResponseWriter, req *http.Request) { 
    fmt.Printf("New Request\n") 
    processRequest(c, req) 
} 

func processRequest(w http.ResponseWriter, req *http.Request){ 
    time.Sleep(time.Second*3) 
    w.Write([]byte("Go Say’s Hello(Via http)")) 
    fmt.Println("End") 
} 

Como quería procesar tanto petición en paralelo añadí el "ir" comando antes "processRequest (c, req)" en la función "sayHello" con el fin de procesar cada solicitud en un gorutine diferente. Pero ... no funciona ... No sé por qué. Sé que ambas solicitudes se procesan porque veo la línea impresa en la consola, pero el navegador sigue esperando información ... y no muestra mi respuesta.

Así que ... mis preguntas,

¿Cada petición de creación de una nueva http.ResponseWriter? o es usar lo mismo? ¿Sabes cómo indicar el servidor web para procesar cada solicitud con diferentes hilos?

Cualquier ayuda es bienvenida ....

Fersca

Respuesta

20

Todas las conexiones se realizan automáticamente al mismo tiempo. Cada conexión TCP (no solicitud) obtiene su propia rutina.

En un mundo con http pipeline y navegadores que reutilizan conexiones, puede que esto no siempre funcione bien. Lo más probable es que su navegador reutilice una conexión que lo detiene hasta que finalice la solicitud actual procesada por la rutina.

+0

Gracias. Hoy se desperdicia tanto tiempo solo por el comportamiento demasiado inteligente del navegador :) –

0

Para permitir el apoyo en tiempo de ejecución para utilizar más de una hebra de OS es posible que desee establecer ese número a través de:

runtime.GOMAXPROCS(n) 

o establezca la variable de entorno GOMAXPROCS.

Para obtener el número de núcleos disponibles, utilice

runtime.NumCPU() 

Así que a menudo terminan con

runtime.GOMAXPROCS(runtime.NumCPU()) 
+0

Esto no ayuda. Go es concurrente por defecto, simplemente no multiproceso (hay una gran diferencia entre los dos). Cambiará a una rutina diferente al bloquear llamadas como 'time.Sleep()' y '.Write()'. – ayke

0

Creo que su navegador está esperando porque no enviará una respuesta de vuelta a ella Su navegador hizo una solicitud para decir Hola y dice que Hola también hizo una solicitud para procesar Solicitud, desde su código processRequest envió una respuesta a sayHello pero dice que Hola no envió una respuesta al navegador.

puede utilizar http.Get o http.Post llamar processRequest

Cuestiones relacionadas