Aula 31 – Tutorial Golang – Operações De Canal Sem Bloqueio

Aula 31 – Tutorial Golang – Operações De Canal Sem Bloqueio

Tutorial Golang

Tutorial Golang

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!

Pacote Programador Fullstack

Pacote Programador Fullstack

Página principal do blog

Todas as aulas desse curso

Aula 30                        Aula 32

Redes Sociais:

facebook

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

PIX Nubank

PIX Nubank

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.

Eu fico por aqui e agradeço a você pela audiência.

Até mais. 🙂

Página principal do blog

Todas as aulas desse curso

Aula 30                        Aula 32

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. 😉

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>