Creazione di un semplice event loop
Implementi uno scheduler di coroutine con una coda di esecuzione e un ciclo di resume.
Creazione di un semplice event loop è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Che cos'è un event loop
Un event loop esegue uno scheduler che riprende le coroutine quando gli eventi attesi sono pronti. Consente di eseguire più attività simultaneamente senza thread del sistema operativo.
La coda di esecuzione
Inizi con una coda di coroutine pronte. A ogni tick, elabori una alla volta tutte le coroutine pronte.
local queue = {}
local function spawn(fn)
queue[#queue+1] = coroutine.create(fn)
endIl tick del loop
A ogni tick, estragga e riprenda ogni coroutine pronta. Le coroutine che eseguono yield vengono messe in pausa finché non vengono aggiunte nuovamente alla coda.
local function runLoop()
while #queue > 0 do
local current = queue
queue = {}
for _, co in ipairs(current) do
local ok, err = coroutine.resume(co)
if not ok then print("Error:", err) end
if coroutine.status(co) ~= "dead" then
queue[#queue+1] = co -- re-queue if still alive
end
end
end
endEseguire yield per mettere in pausa
Una coroutine esegue yield quando deve attendere. Lo scheduler la riprende al tick successivo.
spawn(function()
print("Task A: step 1")
coroutine.yield() -- pause
print("Task A: step 2")
end)
spawn(function()
print("Task B: only step")
end)
runLoop()Ritardi simulati
Implementi una funzione sleep tenendo traccia del momento in cui una coroutine deve riattivarsi.
local timers = {}
local function sleep(seconds)
local wakeAt = os.clock() + seconds
timers[coroutine.running()] = wakeAt
coroutine.yield()
endLoop con gestione dei timer
A ogni tick, controlli i timer e reinserisca nella coda le coroutine il cui momento di riattivazione è trascorso.
local function timedLoop()
while #queue > 0 or next(timers) do
local now = os.clock()
for co, wakeAt in pairs(timers) do
if now >= wakeAt then
timers[co] = nil
queue[#queue+1] = co
end
end
-- process queue...
end
endIntegrazione con l'I/O
Integra un meccanismo select/poll: esegua yield sulle coroutine in attesa dell'I/O e le riprenda quando il relativo file descriptor diventa pronto.
Isolamento degli errori
Racchiuda ogni ripresa di una coroutine in pcall oppure controlli il valore restituito ok. Una coroutine che va in errore non dovrebbe arrestare l'intero loop.
Scheduling cooperativo
Le attività devono eseguire yield volontariamente. Una coroutine che viene eseguita per sempre senza eseguire yield impedirà l'esecuzione di tutte le altre. Utilizzi debug.sethook con un contatore di passi come protezione dalla preemption per il codice non attendibile.
Priorità delle attività
Implementi più code (con priorità alta/normale/bassa) ed elabori per prime le code con priorità più alta a ogni tick.
Alternative reali
Event loop per la produzione: luv (binding di libuv), copas (basato sui socket), OpenResty (nginx + cosocket). Crei un'implementazione personalizzata solo per l'apprendimento o per l'uso in sistemi embedded.
Domanda sugli event loop
Perché le coroutine in un event loop cooperativo devono eseguire yield volontariamente?
Riepilogo: event loop semplice
Un event loop utilizza una coda di esecuzione contenente le coroutine. A ogni tick riprende le coroutine pronte. Le attività eseguono yield per mettersi in pausa e vengono reinserite nella coda quando la loro condizione è soddisfatta. In questo modo Lua può gestire I/O e timer simultanei in un singolo thread.
Domande Frequenti
La lezione «Creazione di un semplice event loop» è gratuita?
Sì — il testo completo di «Creazione di un semplice event loop» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Creazione di un semplice event loop»?
Implementi uno scheduler di coroutine con una coda di esecuzione e un ciclo di resume. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Creazione di un semplice event loop»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Creazione di un semplice event loop
- Async/await con le coroutine
- Pattern simili alle promise
- I/O non bloccante con luasocket