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

Radar no KM 175 da BR101