DEV Community

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

Posted on

6

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.

AWS Q Developer image

Your AI Code Assistant

Ask anything about your entire project, code and get answers and even architecture diagrams. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Start free in your IDE

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay