🚀 Canais

Comunicação segura entre Paralelismo, Assíncrono e Corrotinas!

🚀
Esta É uma seção avançada. Canais são usados com Paralelismo e Assíncrono.

O que são canais?

Canais são como tubos de mensagem. Você coloca algo de um lado, e sai do outro lado! Perfeito para processos conversarem.

Criando um canal

local meu_canal = canal.novo()

Enviando e recebendo

local c = canal.novo()

-- Em um processo/tarefa:
c:envie("Olá!")
c:envie(42)
c:envie({nome = "Sol"})

-- Em outro lugar:
local msg1 = c:receba()   -- "Olá!"
local msg2 = c:receba()   -- 42
local msg3 = c:receba()   -- {nome = "Sol"}
:receba() espera até haver uma mensagem. O programa pausa até chegar algo!

Canal com buffer

Você pode criar um canal que guarda várias mensagens:

-- Canal que guarda até 10 mensagens
local c = canal.novo(10)

-- Pode enviar várias sem ninguém receber ainda
c:envie("Msg 1")
c:envie("Msg 2")
c:envie("Msg 3")

Padrão Produtor-Consumidor

local canal_trabalhos = canal.novo()
local canal_resultados = canal.novo()

-- Trabalhador (em outro processo)
processo.novo(função()
    ::aguarde::
        local trabalho = canal_trabalhos:receba()
        local resultado = trabalho * 2
        canal_resultados:envie(resultado)
        execute aguarde
fim)

-- Enviando trabalhos
canal_trabalhos:envie(10)
canal_trabalhos:envie(20)

-- Recebendo resultados
exiba(canal_resultados:receba())  -- 20
exiba(canal_resultados:receba())  -- 40

Exemplo: Chat simples

local mensagens = canal.novo(100)

-- Quem envia
função enviar(usuario, texto)
    mensagens:envie({
        de = usuario,
        texto = texto,
        hora = sistema_operacional.data("%H:%M")
    })
fim

-- Quem recebe
função exibir_mensagens()
    local msg = mensagens:receba()
    exiba("[" .. msg.hora .. "] " .. msg.de .. ": " .. msg.texto)
fim

enviar("Ana", "Olá!")
exibir_mensagens()  -- [11:36] Ana: Olá!
Canais tornam a comunicação entre partes do seu programa segura e organizada!

🚀 Parabéns! Você completou toda a documentação do Sol!

Voltar ao Início
```