DEV Community

Cover image for Goroutines por baixo dos panos
Mateus Vinícius
Mateus Vinícius

Posted on

Goroutines por baixo dos panos

Goroutine é a implementa do Go de uma corrotina, que é uma solução que existe em diversas linguagens de programação e tem como objetivo criar concorrência gerenciando a execução de funções, de forma que cada função seja executada por uma thread do sistema operacional.

A primeira vista, esse conceito pode parecer similar a uma thread pool, que é um design pattern que consiste em múltiplas threads do sistema operacional e uma fila de processamento, e funciona basicamente da seguinte forma: o nosso programa envia para a fila execuções que devem ser processadas e deixa as threads do sistema operacional atuarem como consumers, puxando esses itens da fila e os processando de forma concorrente. Pense numa thread pool como um load balancer de threads.

Entretanto, Goroutines são diferentes de uma thread pool, e os motivos ficarão claros ao longo do texto, mas podemos adicionar que, por exemplo, cada goroutine não corresponde necessariamente a uma thread real do sistema operacional - inclusive duas goroutines podem eventualmente ser processadas na mesma thread -, e não há um caminho direto entre o que precisa ser processado e está na fila e as threads que irão processar, todo esse percurso é mediado pela estratégia do runtime do Go.

Ao executarmos um programa que cria várias goroutines, o runtime do Go, através do seu scheduler, precisa gerenciar quando e em qual thread essas goroutines vão ser processadas.

Imaginemos que, na nossa execução, temos 2 threads do sistema operacional, o scheduler do Go então vai redirecionar nossas goroutines para serem processadas em uma dessas threads. Num cenário de 4 goroutines para serem processadas pelas 2 threads, o scheduler redireciona a goroutine A e B para ser processada pela thread 1, e a goroutine C e D para ser processada pela thread 2.

E ao contrário de uma thread pool o scheduler do Go não é passivo, ele pode decidir pausar a execução de uma função numa thread, caso haja um bloqueio, por exemplo, e redirecionar essa execução para outa thread, enquanto as threads de uma pool apenas consomem e executam todo pedaço de programa chega na fila. Existe muito mais estratégia e coordenação em tempo de execução numa goroutine do que existe numa thread pool crua.

Goroutine é uma ferramenta poderosíssima do Go porque permite a implementação de concorrência de forma rápida e leve, porque conta com um scheduler que gerencia, como um maestro, em qual thread e quando um pedaço do programa será executado, e pelo fato de cada goroutine criada não necessariamente corresponder a criação de uma nova thread do sistema operacional, o que as torna muito menos custosa e mais fáceis de serem criadas, já que existem numa camada de permissão bem acima das threads do kernel.

Top comments (0)