Você consegue detectar quantos threads um determinado número de goroutines criará?

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Entendo que as goroutines são multiplexadas em vários threads do sistema operacional; portanto, se alguém bloquear, como enquanto espera pela E/S, outros continuarão em execução.Mas existe alguma maneira de saber com antecedência quantos threads eu geraria se criasse n goroutines?

Por exemplo, se chamarmos a função abaixo saberíamos quantos (ou o número máximo de) threads de sistema seriam criados 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
}
Foi útil?

Solução

De acordo com os slides de PDF do Pike Go Course (dia 3):

... se você quer um paralelismo no nível do usuário, você deve definir $GOMAXPROCS ou chamar runtime.GOMAXPROCS(n). GOMAXPROCS Diz ao agendador de tempo de execução quantas goroutinas não-sysCall bloqueadas para rodar de uma só vez.

Baseado em esta postagem do blog, também parece definir a variável de ambiente GOMAXPROCS Permite corrigir o número de threads. Não tenho certeza de como obter o número padrão de threads que o tempo de execução gerenciará se você não especificar esse valor, no entanto.

Esta postagem do blog Parece implicar que, se você não definir a variável de ambiente, o tempo de execução utilizará apenas um núcleo (presumivelmente porque está usando apenas um processo.)

Outras dicas

Cada goroutine pode usar no máximo um thread por vez.Se ele usa um thread ou não, depende do que está fazendo.O valor de GOMAXPROCS determina o número de threads que podem ser usados ​​executando livremente o código Go - em outras palavras, o nível máximo de paralelismo.

No entanto, mais threads podem ser usadas, mesmo com GOMAXPROCS=1, quando goroutines são bloqueadas diretamente em chamadas de sistema ou em C.

As seguintes operações fazem não fazer com que a goroutine use um thread quando bloquear:

  • operações de canal
  • operações de rede
  • dormindo
  • todos os primitivos do sincronizar pacote

Isso significa, por exemplo, que se você tiver muitas goroutines que abrem /dev/ttyxx e bloqueiam na leitura, você usará um thread para cada uma.O mesmo acontece se você estiver executando uma carga de processos e esperando que eles saiam.

Atualmente, o GCCGO criará um tópico por goroutina.

Eu não sei sobre 6g.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top