🔄 Biblioteca: Corrotinas
Crie programas que podem pausar e continuar sua execução!
⚡O que são Corrotinas?
Corrotinas são como funções que podem pausar sua execução e depois continuar de onde pararam. Isso é útil para criar programas que fazem várias coisas "ao mesmo tempo" de forma cooperativa.
Criar Corrotina
-- Criar corrotina a partir de uma função função tarefa() exiba("Início") corrotina.ceda() exiba("Meio") corrotina.ceda() exiba("Fim") fim local co = corrotina.crie(tarefa)
Retomar Execução
-- Retomar corrotina local sucesso, resultado = corrotina.retome(co) -- Exibe: "Início" corrotina.retome(co) -- Exibe: "Meio" corrotina.retome(co) -- Exibe: "Fim" -- Verificar sucesso se não sucesso então exiba("Erro: " .. resultado) fim
Ceder Execução
função contador() para i = 1, 5 faça exiba("Contando: " .. i) corrotina.ceda(i) -- Retorna valor ao ceder fim fim local co = corrotina.crie(contador) enquanto verdadeiro faça local ok, valor = corrotina.retome(co) se não ok ou não valor então interrompa fim exiba("Recebido: " .. valor) fim
Verificar Estado
local co = corrotina.crie(função() corrotina.ceda() fim) -- Verificar estado local estado = corrotina.obtenha_estado(co) exiba(estado) -- "suspenso" corrotina.retome(co) exiba(corrotina.obtenha_estado(co)) -- "suspenso" corrotina.retome(co) exiba(corrotina.obtenha_estado(co)) -- "morto" -- Estados possíveis: -- "executando" - está executando agora -- "suspenso" - pausada, pode ser retomada -- "normal" - ativa mas não executando -- "morto" - terminou execução
Obter Corrotina Atual
-- Obter corrotina em execução local co_atual, eh_principal = corrotina.obtenha_executando() se eh_principal então exiba("Executando na thread principal") fim se não eh_principal então exiba("Executando em corrotina") fim
Verificar se Pode Ceder
função pode_pausar() se corrotina.verifique_pode_ceder() então exiba("Posso pausar aqui") corrotina.ceda() fim se não corrotina.verifique_pode_ceder() então exiba("Não posso pausar (não estou em corrotina)") fim fim -- Na thread principal pode_pausar() -- "Não posso pausar" -- Em corrotina local co = corrotina.crie(pode_pausar) corrotina.retome(co) -- "Posso pausar aqui"
Envolver Corrotina
-- Criar função que automaticamente retoma função gerador() para i = 1, 3 faça corrotina.ceda(i * 10) fim fim local proxima = corrotina.envolva(gerador) -- Chamar como função normal exiba(proxima()) -- 10 exiba(proxima()) -- 20 exiba(proxima()) -- 30
Fechar Corrotina
local co = corrotina.crie(função() local recurso = "aberto" corrotina.ceda() exiba("Limpando recurso") fim) corrotina.retome(co) -- Fechar corrotina (executa limpeza) local sucesso, erro = corrotina.feche(co) se sucesso então exiba("Corrotina fechada") fim
Exemplo: Produtor-Consumidor
função produtor() para i = 1, 5 faça exiba("Produzindo item " .. i) corrotina.ceda(i) fim fim função consumidor(prod) enquanto verdadeiro faça local ok, item = corrotina.retome(prod) se não ok ou não item então interrompa fim exiba("Consumindo item " .. item) fim fim local prod = corrotina.crie(produtor) consumidor(prod)
Exemplo: Iterador Customizado
função fibonacci(n) retorne corrotina.envolva(função() local a, b = 0, 1 para i = 1, n faça corrotina.ceda(a) a, b = b, a + b fim fim) fim -- Usar como iterador local fib = fibonacci(10) para i = 1, 10 faça exiba(fib()) fim -- Saída: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Exemplo: Máquina de Estados
função maquina_estados() exiba("Estado: INICIALIZANDO") corrotina.ceda("inicializado") exiba("Estado: PROCESSANDO") corrotina.ceda("processando") exiba("Estado: FINALIZANDO") corrotina.ceda("finalizado") exiba("Estado: COMPLETO") fim local maquina = corrotina.crie(maquina_estados) enquanto corrotina.obtenha_estado(maquina) ~= "morto" faça local ok, estado = corrotina.retome(maquina) se estado então exiba("→ Transição para: " .. estado) fim fim
Corrotinas são diferentes de threads! Elas são cooperativas, não preemptivas. Só trocam de contexto quando você chama
ceda().
Não confunda corrotinas com paralelismo real. Apenas uma corrotina executa por vez!
Corrotinas são perfeitas para criar iteradores, máquinas de estado e código assíncrono cooperativo!