17/100 Dias de Golang - Concorrência e Goroutines
Table of Contents
#
Concorrência
A concorrência é um dos pilares do desenvolvimento moderno, permitindo que programas executem múltiplas tarefas simultaneamente para melhor aproveitamento dos recursos computacionais. Em sistemas tradicionais, a concorrência é frequentemente implementada usando threads gerenciadas pelo sistema operacional, o que pode introduzir sobrecarga significativa devido à necessidade de alternância de contexto (context switching) e sincronização complexa.
Go foi projetado com a concorrência em mente, oferecendo uma abordagem mais eficiente e acessível por meio das goroutines. Essas unidades leves de execução permitem a construção de programas altamente concorrentes sem os custos elevados das threads convencionais. O runtime do Go gerencia automaticamente o escalonamento das goroutines, otimizando o uso do processador e simplificando o desenvolvimento de aplicações escaláveis e performáticas.
Analisar e compreender um código que faz uso de concorrência é mais desafiador que analisar um código sequencial. Várias vezes que li um código python - linguagem que eu mais utilizo - tive que parar e pensar o que estava acontecendo.
#
Goroutines
As goroutines são funções que podem ser executadas de forma concorrente, bem simples né? É, mais ou menos, por hora podemos pensar que as goroutines são como threads, mas com algumas diferenças importantes. As goroutines são mais leves e gerenciadas pelo runtime do Go, o que significa que você pode criar milhares delas.
É muito simples criar uma goroutine, basta usar a palavra-chave go
antes de chamar uma função. Por exemplo:
go minhaFuncao()
Veja como usar isso em um exemplo simples:
package main
import (
"fmt"
"time"
)
func hello() {
fmt.Println("Isso foi executado em uma Goroutine")
}
func main() {
go hello()
fmt.Println("Continuando")
time.Sleep(time.Second)
fmt.Println("Finalizado")
}
No exemplo acima, a função hello
é chamada como uma goroutine, permitindo que o programa continue executando enquanto hello
é executada em segundo plano. O time.Sleep
é usado para garantir que o programa principal não termine antes da goroutine ser concluída.
Veja a saída desse programa:
Continuando
Isso foi executado em uma Goroutine
Finalizado
Existem muitas coisas que podem ser exploradas sobre as goroutines. O Livro A Linguagem de Programação Go é muito legal nessa etapa de goroutines.