2009-11-11 23 views
8

Entiendo que los goroutines se multiplexan en múltiples subprocesos de sistema operativo, por lo que si uno debe bloquearlos, como por ejemplo mientras espera la E/S, otros continúan ejecutándose. ¿Pero hay alguna forma de saber con anticipación cuántos hilos engendraría si tuviera que crear n goroutines?¿Puedes detectar cuántos hilos creará un número determinado de gorutines?

Por ejemplo, si llamamos a la función debajo de los cuales sabemos cuántos (o el número máximo de) serían creados hilos del sistema para n goroutines:

type Vector []float64 

// Apply the operation to n elements of v starting at i. 
func (v Vector) DoSome(i, n int, u Vector, c chan int) { 
    for ; i < n; i++ { 
     v[i] += u.Op(v[i]) 
    } 
    c <- 1; // signal that this piece is done 
} 
+1

+1 para una de las dos únicas preguntas relevantes (sin rumores, sin chistar) GO hasta ahora –

+1

Eso es solo un bucle for. Ni siquiera expresa concurrencia, y mucho menos paralelismo. – Dustin

Respuesta

7

De acuerdo con diapositivas PDF Ir curso de Pike (día 3):

... si quieres paralelismo a nivel de usuario debe configurar $GOMAXPROCS o llame runtime.GOMAXPROCS(n). GOMAXPROCS le dice al programador de tiempo de ejecución cuántos goroutines no bloqueados por el sistema se ejecutan a la vez.

Basado en this blog post, también, parecería establecer la variable de entorno GOMAXPROCS le permite corregir el número de hilos. No obstante, no estoy seguro de cómo obtener la cantidad predeterminada de subprocesos que ejecutará el motor de ejecución si no especificas este valor.

This blog post parece dar a entender que si no se establece la variable de entorno del tiempo de ejecución sólo se utilizará un núcleo (presumiblemente debido a que sólo se está utilizando un proceso.)

+4

Corrección (cita de la especificación): "GOMAXPROCS establece la cantidad máxima de CPU que pueden ejecutarse simultáneamente y devuelve la configuración anterior". Si N rutinas están atrapadas en N llamadas al sistema (que requieren N hilos), Go siempre tendrá un N + 1 hilo para reprogramar las rutinas de espera. Ver también http://code.google.com/p/go/issues/detail?id = 1644 –

3

Actualmente, gccgo creará un hilo por goroutine .

No sé sobre 6g.

6

Cada goroutine puede utilizar un máximo de un hilo a la hora. Si utiliza un hilo o no depende de lo que está haciendo. El valor de GOMAXPROCS determina el número de subprocesos que se pueden utilizar al ejecutar libremente el código Go; en otras palabras, el nivel máximo de paralelismo.

hilos Sin embargo más se pueden utilizar, incluso con GOMAXPROCS = 1, cuando goroutines bloquean directamente en llamadas al sistema o pone en C.

Las siguientes operaciones hacen no causa la goroutine utilizar un hilo cuando bloquean :

  • operaciones de los canales
  • operaciones de red
  • dormir
  • todo primitivas en el paquete de sync

Esto significa, por ejemplo, que si tiene muchos goroutines que se puede abrir/dev/ttyXX y el bloque de lectura, que va a utilizar un hilo para cada uno. Lo mismo ocurre si está ejecutando una carga de procesos y esperando que salgan.

+0

En cuanto al bloqueo en/dev/ttyxx, Dmitry Vyukov dijo en la lista de correo: "No hay ninguna razón por la que no podamos hacer" sin bloqueo bajo el capó "el manejo de archivos/dispositivos/etc. Simplemente no está hecho Aún así, en Windows es fácil con IOCP, la red sin bloqueo y las operaciones de archivos son las mismas. No estoy seguro de cuál es el estado de AIO en unixes hoy en día ". https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ –

Cuestiones relacionadas