0Pricing
Lua Academy · บทเรียน

การสร้างลูปเหตุการณ์อย่างง่าย

สร้างตัวจัดตารางโคโรทีนที่มีคิวรันและลูป resume

การสร้างลูปเหตุการณ์อย่างง่าย เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

วนรอบเหตุการณ์คืออะไร

วนรอบเหตุการณ์จะเรียกใช้ตัวจัดตารางเวลาซึ่ง resume โครูทีนเมื่อเหตุการณ์ที่โครูทีนรออยู่พร้อมทำงาน วนรอบนี้ช่วยให้ทำงานหลายงานพร้อมกันได้โดยไม่ต้องใช้เธรดของ OS

คิวการทำงาน

เริ่มต้นด้วยคิวของโครูทีนที่พร้อมทำงาน ในแต่ละรอบ ให้ประมวลผลโครูทีนที่พร้อมทำงานทั้งหมดทีละรายการ

local queue = {}
local function spawn(fn)
  queue[#queue+1] = coroutine.create(fn)
end

รอบการทำงานของวนรอบ

ในแต่ละรอบ ให้ดึงโครูทีนที่พร้อมทำงานออกจากคิวแล้ว resume ทีละรายการ โครูทีนที่ใช้ yield จะหยุดพักจนกว่าจะถูกเพิ่มกลับเข้าไปในคิว

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

ใช้ yield เพื่อหยุดพัก

โครูทีนจะใช้ yield เมื่อต้องรอ ตัวจัดตารางเวลาจะ resume โครูทีนนั้นในรอบถัดไป

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

ความล่าช้าที่จำลองขึ้น

จำลองการหยุดรอโดยติดตามเวลาที่โครูทีนควรตื่นขึ้น

local timers = {}
local function sleep(seconds)
  local wakeAt = os.clock() + seconds
  timers[coroutine.running()] = wakeAt
  coroutine.yield()
end

วนรอบที่รองรับตัวจับเวลา

ในแต่ละรอบ ให้ตรวจสอบตัวจับเวลาและนำโครูทีนที่เวลาปลุกผ่านไปแล้วกลับเข้าคิว

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

การผสานรวมอินพุต/เอาต์พุต

ผสานรวมกับกลไกการเลือกหรือการตรวจสอบ ได้แก่ ใช้ yield กับโครูทีนที่กำลังรออินพุต/เอาต์พุต และ resume เมื่อไฟล์อธิบายข้อมูลของโครูทีนพร้อมทำงาน

การแยกข้อผิดพลาด

ห่อหุ้มการ resume ของแต่ละโครูทีนด้วยการเรียกใช้ที่ดักจับข้อผิดพลาด หรือตรวจสอบค่าความสำเร็จที่คืนกลับมา โครูทีนที่ล้มเหลวไม่ควรทำให้วนรอบทั้งหมดหยุดทำงาน

การจัดตารางเวลาแบบร่วมมือกัน

งานต่าง ๆ ต้องใช้ yield ด้วยความสมัครใจ โครูทีนที่ทำงานตลอดโดยไม่ใช้ yield จะทำให้งานอื่นไม่มีโอกาสทำงาน ใช้ debug.sethook ร่วมกับตัวนับขั้นตอนเป็นกลไกป้องกันการตัดการทำงานสำหรับโค้ดที่ไม่น่าเชื่อถือ

ลำดับความสำคัญของงาน

สร้างหลายคิว เช่น คิวลำดับความสำคัญสูง ปกติ และต่ำ แล้วระบายคิวที่มีลำดับความสำคัญสูงกว่าก่อนในแต่ละรอบ

ทางเลือกสำหรับการใช้งานจริง

วนรอบเหตุการณ์สำหรับใช้งานจริง ได้แก่ luv (การเชื่อมโยงกับ libuv), copas (อิงซ็อกเก็ต) และ OpenResty (nginx + cosocket) ควรสร้างขึ้นเองเฉพาะเพื่อการเรียนรู้หรือการใช้งานแบบฝังตัวเท่านั้น

คำถามเรื่องวนรอบเหตุการณ์

เหตุใดโครูทีนในวนรอบเหตุการณ์แบบร่วมมือกันจึงต้องใช้ yield ด้วยความสมัครใจ

ทบทวน: วนรอบเหตุการณ์อย่างง่าย

วนรอบเหตุการณ์ใช้คิวการทำงานของโครูทีน ในแต่ละรอบจะ resume โครูทีนที่พร้อมทำงาน งานต่าง ๆ ใช้ yield เพื่อหยุดพัก และจะถูกนำกลับเข้าคิวเมื่อเงื่อนไขของงานเป็นจริง วิธีนี้ช่วยให้จัดการอินพุต/เอาต์พุตและตัวจับเวลาพร้อมกันได้ใน Lua ที่มีเธรดเดียว

คำถามที่พบบ่อย

บทเรียน “การสร้างลูปเหตุการณ์อย่างง่าย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างลูปเหตุการณ์อย่างง่าย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างลูปเหตุการณ์อย่างง่าย”

สร้างตัวจัดตารางโคโรทีนที่มีคิวรันและลูป resume คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างลูปเหตุการณ์อย่างง่าย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างลูปเหตุการณ์อย่างง่าย
  2. Async/Await ด้วยโคโรทีน
  3. รูปแบบคล้าย Promise
  4. I/O แบบไม่บล็อกด้วย luasocket
← กลับไปที่ Lua Academy