Lua Academy · Lektion

Opbygning af en simpel event loop

Implementér en coroutine-scheduler med en kø til kørsel og en resume-løkke.

Lektion 1 af 413 trin

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)
end

Lø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
end

At 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()
end

Tidsstyrret 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
end

Integration 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.

Gratis at komme i gang

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

  1. Opbygning af en simpel event loop
  2. Async/await med coroutiner
  3. Promise-lignende mønstre
  4. Ikkeblokkerende I/O med luasocket
← Tilbage til Lua Academy