¿Puede detectar cuántos hilos creará un número determinado de Goroutinas?

StackOverflow https://stackoverflow.com/questions/1714136

  •  19-09-2019
  •  | 
  •  

Pregunta

Entiendo que las goroutinas se multiplican en múltiples hilos del sistema operativo, por lo que si uno se bloquea, como mientras esperaba E/S, otras continúan funcionando. Pero, ¿hay alguna forma de saber con anticipación cuántos hilos generaría si hubiera creado n goroutinas?

Por ejemplo, si llamamos a la función a continuación, ¿sabremos cuántos (o el número máximo de) hilos del sistema se crearían para N Goroutinas:

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
}
¿Fue útil?

Solución

Según Pike's Go Course PDF Diapositivos (Día 3):

... Si quieres paralelismo a nivel de usuario, debes establecer $GOMAXPROCS o llamar runtime.GOMAXPROCS(n). GOMAXPROCS le dice al programador de tiempo de ejecución cuántas goroutinas no bloqueadas por syscall se ejecutar a la vez.

Residencia en esta publicación de blog, también, parece establecer la variable de entorno GOMAXPROCS Te permite arreglar el número de hilos. Sin embargo, no estoy seguro de cómo obtener el número predeterminado de subprocesos que el tiempo de ejecución se administrará si no especifica este valor.

Esta publicación de blog Parece implicar que si no establece la variable de entorno, el tiempo de ejecución solo utilizará un núcleo (presumiblemente porque solo está usando un proceso).

Otros consejos

Cada goroutina puede usar un máximo de un hilo a la vez. Si usa un hilo o no depende de lo que esté haciendo. El valor de GOMAXPROCS determina el número de hilos que se pueden usar en el código GO que ejecutan libremente, en otras palabras, el nivel máximo de paralelismo.

Sin embargo, se pueden usar más hilos, incluso con gomaxprocs = 1, cuando las goroutinas se bloquean directamente en llamadas del sistema o llamadas a C.

Las siguientes operaciones hacen no Hacer que la Goroutine use un hilo cuando bloquean:

  • operaciones de canal
  • operaciones de red
  • dormido
  • todas las primitivas en el sincronización paquete

Esto significa, por ejemplo, que si tiene muchas goroutinas que abren /dev /ttyxx y bloquean la lectura, usará un hilo para cada uno. Lo mismo ocurre si está ejecutando una carga de procesos y esperando que salgan.

Actualmente, GCCGO creará un hilo por Goroutine.

No sé sobre 6G.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top