34/100 Dias de Golang - Como o Runtime do Golang Gerencia Goroutines
Table of Contents
#
Como o Runtime do Golang Gerencia Goroutines
O scheduler do Go é responsável por organizar e distribuir a execução das goroutines nas threads do sistema operacional. Como já falamos em outro post sobre as goroutines são muito mais leves que threads, então você pode ter milhares rodando ao mesmo tempo. Mas como o sistema operacional tem um número limitado de threads, o scheduler cuida de organizar quais goroutines rodam em quais threads e quando.
O Go adota um modelo conhecido como M:N scheduling. M goroutines em N threads do sistema operacional
#
GOMAXPROCS
Essa variável determina quantas threads de sistema operacional podem estar ativas executando código ao mesmo tempo, essa variável representa o n
no escalonamento m:n
. Vou pegar o mesmo exemplo do livro A Linguagem de Programação Go para fazer esse teste. Vou definir o a variável diretamente com runtime.GOMAXPROCS(10)
, se a teoria estiver correta, tenho que abrir meu htop
encontrar o go que está rodando e ele deve ter 10 threads rodando.
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(10)
for {
go fmt.Print(0)
fmt.Print(1)
}
}
Exatamente como a teoria prevê:
O scheduler do Go é uma das razões pelas quais a linguagem é tão poderosa para concorrência. Se quiseremos ir mais fundo podemos analisar o código do golang sobre o scheduler, 7000 linhas de código, bem tranquilo…rsrs