Opbygning af en simpel event loop
Implementér en coroutine-scheduler med en kø til kørsel og en resume-løkke.
Opbygning af en simpel event loop er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad er en hændelsesløkke?
En hændelsesløkke kører en planlægger, der genoptager coroutines, når de hændelser, de afventer, er klar. Det gør det muligt at køre flere samtidige opgaver uden OS-tråde.
Kørselskøen
Begynd med en kø af coroutines, der er klar. Behandl alle klar-tilstande coroutines én ad gangen ved hvert trin.
local queue = {}
local function spawn(fn)
queue[#queue+1] = coroutine.create(fn)
endLøkkens trin
Ved hvert trin tages hver klar coroutine ud af køen og genoptages. Coroutines, der giver kontrollen tilbage, sættes på pause, indtil de føjes til køen igen.
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
endAt give kontrollen tilbage for at sætte på pause
En coroutine giver kontrollen tilbage, når den skal vente. Planlæggeren genoptager den ved næste trin.
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()Simulerede forsinkelser
Implementér sleep ved at holde styr på, hvornår en coroutine skal vågne.
local timers = {}
local function sleep(seconds)
local wakeAt = os.clock() + seconds
timers[coroutine.running()] = wakeAt
coroutine.yield()
endTidsstyrret løkke
Kontrollér timerne ved hvert trin, og sæt coroutines, hvis vækketid er overskredet, i kø igen.
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
endIntegration med I/O
Integrér med en select/poll-mekanisme: Lad coroutines, der venter på I/O, give kontrollen tilbage, og genoptag dem, når deres fildeskriptor er klar.
Isolering af fejl
Pak hver genoptagelse af en coroutine ind i pcall, eller kontrollér den returnerede ok-værdi. En coroutine, der går ned, bør ikke få hele løkken til at gå ned.
Samarbejdsbaseret planlægning
Opgaver skal frivilligt give kontrollen tilbage. En coroutine, der kører uendeligt uden at give kontrollen tilbage, vil blokere alle andre. Brug debug.sethook med en trin-tæller som beskyttelse mod præemption af kode, du ikke stoler på.
Opgaveprioriteter
Implementér flere køer (høj/normal/lav prioritet), og tøm køerne med højere prioritet først ved hvert trin.
Alternativer fra den virkelige verden
Hændelsesløkker til produktion: luv (bindinger til libuv), copas (socketbaseret), OpenResty (nginx + cosockets). Skriv kun din egen til læring eller indlejret brug.
Spørgsmål om hændelsesløkken
Hvorfor skal coroutines i en samarbejdsbaseret hændelsesløkke frivilligt give kontrollen tilbage?
Opsummering: Simpel hændelsesløkke
En hændelsesløkke bruger en kø af coroutines, der skal køre. Ved hvert trin genoptages de coroutines, der er klar. Opgaver giver kontrollen tilbage for at sætte på pause og føjes til køen igen, når deres betingelse er opfyldt. Det gør samtidig I/O og timere mulige i Lua med én tråd.
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Opbygning af en simpel event loop” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Opbygning af en simpel event loop”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Opbygning af en simpel event loop”?
Implementér en coroutine-scheduler med en kø til kørsel og en resume-løkke. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Opbygning af en simpel event loop”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Opbygning af en simpel event loop
- Async/await med coroutiner
- Promise-lignende mønstre
- Ikkeblokkerende I/O med luasocket