0Pricing
Lua Academy · درس

إنشاء حلقة أحداث بسيطة

نفّذ مجدولًا للبرامج التعاونية باستخدام قائمة تشغيل وحلقة استئناف

إنشاء حلقة أحداث بسيطة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما حلقة الأحداث؟

تشغّل حلقة الأحداث جدولةً تستأنف coroutines عندما تصبح الأحداث التي تنتظرها جاهزة. ويتيح ذلك تشغيل مهام متعددة بالتزامن دون استخدام خيوط نظام التشغيل.

قائمة التشغيل

ابدأ بقائمة من coroutines الجاهزة. في كل نبضة، عالج جميع coroutines الجاهزة واحدةً تلو الأخرى.

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

نبضة الحلقة

في كل نبضة، تُخرج الحلقة كل coroutine جاهز وتستأنفه. وتتوقف coroutines التي تنفّذ 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 للإيقاف المؤقت

تنفّذ coroutine ‏yield عندما تحتاج إلى الانتظار. وتستأنفها أداة الجدولة في النبضة التالية.

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

التأخيرات المحاكاة

نفّذ عملية sleep بتتبع الوقت الذي ينبغي فيه إيقاظ coroutine.

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

حلقة تراعي المؤقتات

في كل نبضة، افحص المؤقتات وأعد إلى القائمة coroutines التي تجاوز وقت إيقاظها.

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

دمج عمليات الإدخال والإخراج

ادمج الحلقة مع آلية select/poll: نفّذ yield لـ coroutines التي تنتظر عمليات الإدخال والإخراج، واستأنفها عندما يصبح واصف الملف الخاص بها جاهزًا.

عزل الأخطاء

غلّف استئناف كل coroutine داخل pcall أو افحص قيمة الإرجاع ok. يجب ألا تؤدي coroutine المتوقفة بسبب خطأ إلى إيقاف الحلقة بأكملها.

الجدولة التعاونية

يجب أن تنفّذ المهام yield طوعًا. فإذا استمرت coroutine في العمل إلى ما لا نهاية دون تنفيذ yield، فستحرم جميع coroutines الأخرى من وقت التنفيذ. استخدم debug.sethook مع عدّاد للخطوات كحاجز استباقي عند تشغيل تعليمات برمجية غير موثوقة.

أولويات المهام

نفّذ قوائم متعددة (أولوية عالية/عادية/منخفضة)، واستنفد القوائم ذات الأولوية الأعلى أولًا في كل نبضة.

البدائل العملية

حلقات الأحداث الجاهزة للإنتاج: luv (ارتباطات libuv)، وcopas (المعتمدة على المقابس)، وOpenResty (nginx + cosockets). لا تنفّذ حلقة خاصة بك إلا للتعلّم أو للاستخدام المضمّن.

سؤال حول حلقة الأحداث

لماذا يجب على coroutines في حلقة أحداث تعاونية تنفيذ yield طوعًا؟

مراجعة: حلقة أحداث بسيطة

تستخدم حلقة الأحداث قائمة تشغيل من coroutines. وتستأنف في كل نبضة coroutines الجاهزة. تنفّذ المهام yield للتوقف مؤقتًا، ثم تُعاد إلى القائمة عند تحقق شرطها. ويتيح ذلك تنفيذ عمليات الإدخال والإخراج والمؤقتات بالتزامن في Lua أحادية الخيط.

الأسئلة الشائعة

هل درس «إنشاء حلقة أحداث بسيطة» مجاني؟

نعم — نص درس «إنشاء حلقة أحداث بسيطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «إنشاء حلقة أحداث بسيطة»؟

نفّذ مجدولًا للبرامج التعاونية باستخدام قائمة تشغيل وحلقة استئناف تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «إنشاء حلقة أحداث بسيطة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء حلقة أحداث بسيطة
  2. Async/Await باستخدام البرامج التعاونية
  3. أنماط شبيهة بالوعود
  4. إدخال وإخراج غير حاجب باستخدام luasocket
← العودة إلى Lua Academy