Domanda

Capisco che le goroutine sono multiplex su più thread del sistema operativo, quindi se si dovrebbe bloccare, ad esempio in attesa di I/O, altri continuano a funzionare. Ma c'è un modo per sapere in anticipo quanti thread che mi generare se dovessi creare n goroutine?

Ad esempio, se chiamiamo la funzione di seguito sapremmo quanti (o il numero massimo di) thread di sistema verrebbero creati per n goroutine:

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
}
È stato utile?

Soluzione

Secondo Pike's Go Course PDF Slides (Giorno 3):

... se vuoi il parallelismo a livello di utente devi impostare $GOMAXPROCS oppure chiama runtime.GOMAXPROCS(n). GOMAXPROCS Dice allo scheduler di runtime quante goroutine non collocate non vengono eseguite contemporaneamente.

Basato su Questo post sul blog, anche se sembrerebbe impostare la variabile dell'ambiente GOMAXPROCS Ti consente di correggere il numero di thread. Non sono sicuro di come ottenere il numero predefinito di thread che il runtime gestirà se non si specifica questo valore, tuttavia.

Questo post sul blog Sembra implicare che se non si imposta la variabile di ambiente, il runtime utilizzerà solo un core (presumibilmente perché sta usando solo un processo.)

Altri suggerimenti

Ogni goroutine può utilizzare un massimo di un thread alla volta. Che si tratti di un thread o meno dipende da cosa sta facendo. Il valore di GomaxProcs determina il numero di thread che possono essere utilizzati mediante il codice GO liberamente - in altre parole, il livello massimo di parallelismo.

Tuttavia, è possibile utilizzare più thread, anche con GomaxProcs = 1, quando le goroutine si bloccano direttamente sulle chiamate di sistema o le chiamate in C.

Le seguenti operazioni lo fanno non causare la goroutine di usare un thread quando si blocca:

  • Operazioni del canale
  • Operazioni di rete
  • dormire
  • Tutti i primitivi nel sincronizzazione pacchetto

Ciò significa, ad esempio, che se hai molte goroutine che si aprono /dev /ttyxx e bloccano su lettura, utilizzerai un thread per ognuno. Lo stesso vale se stai eseguendo un carico di processi e stai aspettando che escano.

Attualmente, GCCGO creerà un thread per goroutine.

Non so 6G.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top