Lua Coroutines
Neste artigo, exploraremos as corrotinas Lua , como elas funcionam e como usá-las efetivamente em seus programas Lua.
As corrotinas são um recurso poderoso da linguagem de programação Lua que permite escrever código assíncrono em um estilo síncrono.
Usando uma co-rotina em Lua, você pode pausar e retomar uma função.
Uma co-rotina executa a função que você especifica, assim como uma chamada de função normal . No entanto, ao contrário das funções regulares, uma corrotina pode ser executada a qualquer momento, permitindo que outra corrotina assuma o controle.
O que são Lua Coroutines?
As co-rotinas são um tipo especial de função Lua que pode devolver o controle ao chamador enquanto mantém seu próprio estado.
Isso permite que várias corrotinas sejam executadas simultaneamente no mesmo encadeamento Lua.
Quando uma co-rotina cede, ela suspende sua execução e retorna um valor ao chamador.
O chamador pode retomar a co-rotina posteriormente, passando um novo valor a ser usado na próxima iteração da co-rotina.
Funções Lua Cor-Rotina
A biblioteca de corrotinas fornece várias funções que permitem criar, retomar e produzir corrotinas.
Funções de corrotina | Visão geral |
coroutine.create(f) | Cria uma nova co-rotina com a função f. Quando a co-rotina for retomada pela primeira vez, a função f será executada. |
coroutine.resume(co, …) | Retoma a co-rotina passada como argumento. Se a co-rotina foi suspensa antes, ela continua a execução de onde parou. Os argumentos opcionais passados para resumir são os valores a serem passados para a co-rotina como argumentos. Se a co-rotina não foi suspensa antes, o resumo começa no início. |
coroutine.yield(…) | Suspende a co-rotina e retorna ao chamador. A função yield retorna os argumentos passados para a chamada de retomada quando a co-rotina é retomada novamente. |
coroutine.status(co) | Retorna o status da co-rotina passada como argumento. Os valores possíveis são “ suspenso ”, “em execução”, “morto” ou “normal”. |
coroutine.wrap | Cria uma nova co-rotina e retorna uma função que a retoma quando chamada. Pode ser usado como uma alternativa mais simples para coroutine.create e coroutine.resume . |
coroutine.running | Este método retorna o objeto da co-rotina que está em execução no momento ou nil se for chamado do thread principal. |
coroutine.isyieldable | Retorna um booleano que indica se a co-rotina atual pode ser cedida. Com coroutine.wrap , as corrotinas não podem ceder e sempre retornarão false. |
O exemplo a seguir é implementado usando os métodos coroutine.create , coroutine.resume() , coroutine.yield() , coroutine.status() , coroutine.running() e coroutine.isyieldable() em Lua:
Example:
O código acima define duas funções, safeYield e printCurrentCoroutine, e a função lua co-rotina chamada myCoroutine. Ele cria uma nova corrotina e a executa com coroutine.resume, chamando a função safeYield que verifica se é seguro ceder e retorna a corrotina.
O código verifica o status da co-rotina após cada retomada usando coroutine.status e imprime o status. A co-rotina executa três iterações e depois finaliza, portanto, ao ser retomada novamente, gera um erro e o status é impresso como “morto”.
O exemplo a seguir mostra como usar a função lua coroutine.wrap :