Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Criar coroutine
  2. Executar coroutine
  3. Verificar status de coroutine
  4. Suspender um coroutine
  5. Finalizar coroutine

Coroutines são um conjunto de rotinas que são executadas sob certo controle e ordem para trabalharem de forma colaborativa.

Características
  1. -Executados em sequência sem concorrência.
  2. -Possuem o status suspenso, executando e morta
  3. -Depois de morta não pode ser resumida/executada
  4. -Não é preemptiva. Não pode ser parada por uma chamada externa. Uma vez executada, não pode ser parada internamente com o comando yield
  5. -Podem receber argumentos
  6. -Podem retornar valores
  7. -Podem ser utilizadas com variáveis globais

A criação de uma coroutine é feita utilizando a função create do módulo coroutine. O status inicial de uma coroutine é sempre suspensa(suspended).

Sintaxe
coroutine.create(f)
Onde
f: função que desejamos criar como coroutine
Retorno
thread para controle de f
Exemplo 1
local function funcao()
  print("hello world")
end

local corotina =  coroutine.create(funcao)
Saída
-

Ao criarmos uma nova coroutine, essa fica em estado suspenso até que requisitemos sua execução com o comando resume. Ao término da execução não podemos invocar o resume.

Sintaxe
coroutine.resume(co,[,va1])
Onde
co: coroutine que desejamos executar
val: argumentos da corotina. Opcional
Retorno
Se a execução ocorrer sem erros, retorna true e um valor de retorno da coroutine se declarado.
Se a execução ocorrer com erros, retorna false e uma mensagem de erro.
Exemplo 2
local function funcao()
  print("hello world")
end

local corotina =  coroutine.create(funcao)
status, valor = coroutine.resume(corotina)
print(status,valor)
corotina = nil
Saída
hello world
true	nil
Exemplo 3
local function funcao()
  print("hello world")
end

local corotina =  coroutine.create(funcao)
local status, valor = coroutine.resume(corotina)
print(status,valor)
status, valor = coroutine.resume(corotina) --corotina "morta"
print(status,valor)
corotina = nil
Saída
hello world
true	nil
false	cannot resume dead coroutine

Para verificarmos em qual status atual nossas coroutines estão, utilizamos o método status como mostrado no exemplos abaixo:

Sintaxe
coroutine.status(co)
Onde
c: coroutine que desejamos obter o status
Retorno
running(Executando),dead(Morta) ou suspended(Suspensa)
Exemplo 4
local function funcao()
  print("hello world")
end

local corotina =  coroutine.create(funcao)
print(coroutine.status(corotina))
coroutine.resume(corotina)
print(coroutine.status(corotina))
corotina = nil
Saída
suspended
hello world
dead

Para suspender temporariamente a execução de uma coroutine utilizamos a função yield que é chamado internamente em uma coroutine.

Sintaxe
coroutine.yield()

Uma vez chamada, o status da coroutine é alterado para suspended e pode ter sua execução continuada utilizando a função resume.

Exemplo 5
--coroutine
local function funcao()
  for i=1, 10, 1 do
    print(i)
    if (i == 5) then -- condição para suspensão
      print("execução suspensa")
      coroutine.yield() 
    end
  end
end

local corotina =  coroutine.create(funcao) --criação
local status = coroutine.resume(corotina) --execução

print("Status execução:",status)
print("status coroutine:",coroutine.status(corotina))

print("continuando execução")
status = coroutine.resume(corotina)

print("Status execução:",status)
print("status coroutine:",coroutine.status(corotina))
Saída
1
2
3
4
5
execução suspensa
Status execução:	true
status coroutine:	suspended
continuando execução
6
7
8
9
10
Status execução:	true
status coroutine:	dead

Para encerrarmos completamente uma coroutine e alterarmos seus status para dead, utilizamos a função close.

Sintaxe
coroutine.close(co)
Onde
co: coroutine que desejamos fechar.
Retorno
Caso ocorra erro, retorna false e mensagem de erro. Caso contrário, true.
Exemplo 6
--coroutine
local function funcao()
  for i=1, 10, 1 do
    print(i)
    if (i == 5) then -- condição para suspensão
      print("execução suspensa")
      coroutine.yield() 
    end
  end
end

local corotina =  coroutine.create(funcao) --criação
local status = coroutine.resume(corotina) --execução
print("Status execução:",status)
print("status coroutine:",coroutine.status(corotina))
status,erro = coroutine.close(corotina)
print(status,erro)
Saída
1
2
3
4
5
execução suspensa
Status execução:	true
status coroutine:	suspended
  1. 12/09/2024 - revisão 2 - Correção em descrição de 'Verificando status de uma coroutine', ajustes gramaticais
  2. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais
  3. 26/05/2023 - versão inicial