Postagem em destaque

Huguinho e Zezinho surfando com granizo

Imagem
Certa vez, em outubro de 2023, Huguinho e seu amigo Zezinho foram surfar no final da tarde. O vento estava forte e a chuva, constante. Quando chegaram perto da praia, mal conseguiam segurar suas pranchas. O mar estava bem mexido, e ainda tiveram que andar cerca de 1 km até o pico. Quando estavam se aproximando, começou a cair granizo! Dava para ouvir claramente o barulho das pedras contra as pranchas. Eles se abrigaram embaixo do posto avançado dos salva-vidas, mas não adiantou muito. Ficaram olhando o mar — que estava bem agitado e quebrando bem longe — e perceberam que estava difícil passar a arrebentação. Como o granizo não parava, decidiram entrar assim mesmo. Logo que entraram no mar, o granizo cessou, mas aí começou o verdadeiro desafio: passar a arrebentação. Depois de levar várias séries na cabeça e quase sem forças, finalmente conseguiram. E começaram os raios! Quando estavam quase decidindo sair por causa deles, os raios pararam. Ufa! É algo estranho: você está lá, só você (c...

Dicas Go - #1 - Goroutines

Já falei um pouco sobre concorrência em Go, mas percebi que não fui muito esclarecedor, por isso vou fazer uma outra abordagem, mais detalhada, sobre esse assunto. O código completo dos programas está no final do texto.

Vamos imaginar que você queira fazer um programa que faça acesso à uma API algumas vezes e retorne o resultado como string. Para não tornar o programa muito complexo, utilizei uma pesquisa fake, que simula um retorno e gasta  100 milissegundos. Ao rodar o programa sequencial.go, vemos na tela uma saída como a abaixo:


Como esperado, os resultados são listados em ordem, de "golang 0" à "golang 19". E o tempo gasto, pouco mais de 2s, também não é nenhuma surpresa (20 vezes 100 milissegundos mais algum tempo do resto do código).

A coisa começa a melhorar quando rodamos o programa concorrente.go.


O tempo gasto reduziu de 2s para 100ms. Qual é a mágica? São as goroutines! Se reparar bem, são poucas mudanças em relação ao código original (na verdade, essa é uma das formas que podemos usar as goroutines, mas é a que acho mais simples).

A primeira mudança é a criação de um canal com buffer de capacidade 4. Na prática, podemos enviar até 4 valores neste canal sem bloquear a goroutine. 

c := make(chan string, 4)

A segunda mudança é a chamada da função fakeSearch:

go func(j int) {
c <- fakeSearch("golang " + fmt.Sprintf("%d", j))
}(i)

Usamos uma função anônima para englobar a chamada em si, pois esta retorna um canal de string e não temos como chamar a função da forma abaixo:

go c <- fakeSearch("golang " + fmt.Sprintf("%d", j))

Por fim, temos que ler as respostas do canal, e para isso usamos um for para ler cada uma das respostas:

for i := 0; i < 20; i++ {
fmt.Printf("#%d - %s", i, <-c)
}

Aqui, o programa simplesmente joga o resultado que está no canal (<-c) para a tela, mas ele poderia ser armazenado num slice de strings por exemplo.

Código dos programas

Comentários

Postagens mais visitadas deste blog

Google Hacking

Netflix não mostra ícone de streaming

WSL: Backup e Restauração