Sobes.tech
Junior — Middle

Em que caso e como as threads podem aceder à fila global para obter tarefas e iniciar goroutines?

sobes.tech IA

Resposta da IA

No Go, o runtime utiliza um modelo M:N, onde M são os threads do sistema e N são as goroutines. As goroutines não estão diretamente vinculadas a threads específicos, mas são executadas num pool de threads.

A fila global de tarefas é uma fila de goroutines prontas para execução, mas ainda não atribuídas a um thread específico. Quando um thread fica livre, ele consulta essa fila global para obter a próxima goroutine a ser executada.

Isso acontece aproximadamente assim:

  • Quando uma goroutine é criada (através de go), ela é colocada na fila global.
  • Um thread livre pega uma goroutine da fila global e começa a executá-la.
  • Se o thread não encontrar tarefas na sua fila local, ele consulta a global.

Dessa forma, os threads obtêm dinamicamente tarefas da fila global e executam as goroutines correspondentes, garantindo um balanceamento de carga e uso eficiente dos recursos do sistema.

Exemplo (simplificado):

// Criamos várias goroutines
for i := 0; i < 10; i++ {
    go func(n int) {
        fmt.Println("Goroutine", n)
    }(i)
}

O runtime coloca essas goroutines na fila global, e os threads do sistema as pegam para execução.