Aula 31 – Tutorial Golang – Operações De Canal Sem Bloqueio
Aula 31 – Tutorial Golang – Operações De Canal Sem Bloqueio
Compartilho com vocês conteúdo de qualidade de forma gratuita como parte da missão do Código Fluente.
No entanto, também quero apresentar uma oportunidade imperdível de aprimorar suas habilidades em programação para alcançar um nível avançado.
Conheça agora mesmo o curso Master Full Stack clicando no link abaixo 👇 e confira!
Página principal do blog
Todas as aulas desse curso
Aula 30 Aula 32
Redes Sociais:
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Melhore seu NETWORKING
https://digitalinnovation.one/
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no https://github.com/toticavalcanti.
Código final da aula:
https://github.com/toticavalcanti
Canais do Youtube:
Toti
Backing Track / Play-Along
Código Fluente
Putz!
Vocal Techniques and Exercises
PIX para doações
Aula 31 – Tutorial Golang – Operações De Canal Sem Bloqueio
Fontes usadas para esse post:
Operações De Canal Sem Bloqueio
Olá a todos!
Hoje vamos falar sobre Operações De Canal Sem Bloqueio em Golang e como elas podem ser úteis no mundo real.
Se você é um desenvolvedor de Go, já sabe que as operações de canal são uma das características mais poderosas da linguagem.
Eles permitem que você crie sistemas concorrentes de alta eficiência e escalabilidade.
Mas às vezes, as operações de canal podem causar bloqueios desnecessários em seu código.
É aqui que as Operações De Canal Sem Bloqueio em Go entram em cena.
Elas permitem que você execute operações de canal sem bloquear o fluxo de execução do programa.
Quando você deve usar Operações De Canal Sem Bloqueio em Go?
A resposta é: sempre que você precisar executar uma operação de canal, mas não quiser que ela bloqueie o programa.
Por exemplo, se você estiver escrevendo um servidor web, poderá usar Operações De Canal Sem Bloqueio para enviar mensagens assíncronas aos clientes sem bloquear o thread do servidor principal.
Outra vantagem das Operações De Canal Sem Bloqueio é que elas podem ser usadas para criar programas que são mais eficientes em termos de recursos.
Isso ocorre porque as operações de canal sem bloqueio não exigem que você crie novas goroutines para cada tarefa, o que pode ser muito caro em termos de recursos.
Vamos dar uma olhada em um exemplo de código para demonstrar como as Operações De Canal Sem Bloqueio em Go podem ser usadas na prática:
Exemplo 01
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-c:
fmt.Println("recebeu:", x)
default:
fmt.Println("não recebeu nada")
}
c <- i
time.Sleep(100 * time.Millisecond)
}
}
Saída:
não recebeu nada
recebeu: 0
recebeu: 1
recebeu: 2
recebeu: 3
recebeu: 4
recebeu: 5
recebeu: 6
recebeu: 7
recebeu: 8
Análise do Código ☝️
Neste exemplo, criamos um canal com buffer de tamanho 1 e usamos uma operação de canal sem bloqueio em um loop select para verificar se há um valor no canal.
Se houver, o valor é impresso na tela.
Se não houver, a mensagem “não recebeu nada” é impressa.
Em seguida, o loop envia um valor para o canal e aguarda um curto período de tempo antes de prosseguir para a próxima iteração.
Exemplo 02
Vamos supor que você esteja desenvolvendo um sistema de vendas online em Golang e que precisa atualizar o estoque do produto assim que uma venda for realizada.
Para isso, você precisa que o servidor de vendas envie uma mensagem para o servidor de estoque para que o estoque seja atualizado.
Você pode usar canais sem bloqueio para garantir que essa mensagem seja enviada de forma assíncrona e que o processo de venda não seja bloqueado enquanto o estoque é atualizado.
Primeiro, vamos criar um canal sem bloqueio para enviar a mensagem de atualização do estoque:
stockUpdateCh := make(chan int, 1)
Em seguida, vamos criar uma função que envia uma mensagem de atualização do estoque para o canal sem bloqueio:
func updateStock(stockUpdateCh chan<- int, productId int, quantity int) {
// Código para atualizar o estoque do produto
// ...
stockUpdateCh <- productId
}
A função updateStock() recebe como parâmetro o canal sem bloqueio stockUpdateCh, o ID do produto e a quantidade a ser atualizada.
Dentro da função, você implementaria o código necessário para atualizar o estoque do produto.
Por fim, no servidor de vendas, você pode chamar a função updateStock() em uma goroutine separada, para garantir que o processo de venda não seja bloqueado enquanto o estoque é atualizado:
go updateStock(stockUpdateCh, productId, quantity)
Com isso, você pode garantir que a mensagem de atualização do estoque seja enviada de forma assíncrona, sem bloquear o processo de venda.
Aqui está um código mais completo do uso de canais sem bloqueio para atualização de estoque em um sistema de vendas online:
package main
import (
"fmt"
"time"
)
func main() {
// Criando um canal sem bloqueio para atualização de estoque
stockUpdateCh := make(chan int, 1)
// Iniciando uma goroutine para processar as atualizações de estoque
go func() {
for productId := range stockUpdateCh {
// Simulando uma atualização de estoque
fmt.Printf("Atualizando estoque do produto %d...\n", productId)
time.Sleep(2 * time.Second)
fmt.Printf("Estoque do produto %d atualizado\n", productId)
}
}()
// Realizando uma venda e atualizando o estoque do produto
productId := 123
fmt.Printf("Realizando venda do produto %d...\n", productId)
time.Sleep(time.Second)
// Enviando uma mensagem para o canal sem bloqueio de atualização de estoque
select {
case stockUpdateCh <- productId:
fmt.Printf("Mensagem de atualização de estoque para o produto %d enviada com sucesso\n", productId)
default:
fmt.Printf("Falha ao enviar mensagem de atualização de estoque para o produto %d\n", productId)
}
// Finalizando a venda
fmt.Printf("Venda do produto %d realizada com sucesso\n", productId)
}
Saída:
Realizando venda do produto 123…
Atualizando estoque do produto 123…
Mensagem de atualização de estoque para o produto 123 enviada com sucesso
Venda do produto 123 realizada com sucesso
Análise do Código ☝️
Neste exemplo, criamos um canal sem bloqueio stockUpdateCh para atualização de estoque.
Em seguida, iniciamos uma goroutine para processar as atualizações de estoque.
Dentro da goroutine, simulamos uma atualização de estoque com uma espera de 2 segundos.
No processo de venda, realizamos uma venda do produto 123.
Em seguida, enviamos uma mensagem para o canal sem bloqueio de atualização de estoque usando a cláusula select.
Se o envio da mensagem falhar, a cláusula default é acionada.
Com este exemplo, você pode ver como os canais sem bloqueio podem ser usados para enviar mensagens assíncronas em um sistema de vendas online, sem bloquear o processo de venda.