0Pricing
Lua Academy · Урок

Создание простого цикла событий

Реализуйте планировщик сопрограмм с очередью выполнения и циклом возобновления.

«Создание простого цикла событий» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Что такое цикл событий

Цикл событий запускает планировщик, который возобновляет корутины, когда ожидаемые ими события готовы. Это позволяет выполнять несколько параллельных задач без потоков ОС.

Очередь выполнения

Начните с очереди готовых корутин. На каждом шаге обрабатывайте все готовые корутины одну за другой.

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

Шаг цикла

На каждом шаге извлекайте и возобновляйте каждую готовую корутину. Корутины, которые уступили управление, приостанавливаются до повторного добавления в очередь.

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

Уступить управление для приостановки

Корутина уступает управление, когда ей необходимо подождать. Планировщик возобновляет её на следующем шаге.

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

Интеграция с вводом-выводом

Интегрируйте механизм select или опроса: приостанавливайте корутины, ожидающие ввода-вывода, и возобновляйте их, когда дескриптор файла будет готов.

Изоляция ошибок

Оберните возобновление каждой корутины в pcall или проверяйте возвращаемое значение ok. Сбой одной корутины не должен останавливать весь цикл.

Кооперативное планирование

Задачи должны добровольно уступать управление. Корутина, которая выполняется бесконечно и не уступает управление, заблокирует все остальные. Используйте debug.sethook со счётчиком шагов как защиту от вытеснения для ненадёжного кода.

Приоритеты задач

Реализуйте несколько очередей (с высоким, обычным и низким приоритетом) и на каждом шаге сначала опустошайте очереди с более высоким приоритетом.

Альтернативы для практического применения

Циклы событий для рабочих систем: luv (привязки к libuv), copas (на основе сокетов), OpenResty (nginx + косокеты). Создавайте собственную реализацию только для обучения или встраиваемых систем.

Вопрос о цикле событий

Почему корутины в кооперативном цикле событий должны добровольно уступать управление?

Повторение: простой цикл событий

Цикл событий использует очередь выполнения корутин. На каждом шаге он возобновляет готовые корутины. Задачи уступают управление для приостановки и снова добавляются в очередь, когда выполняется их условие. Это позволяет выполнять операции ввода-вывода и таймеры параллельно в 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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание простого цикла событий
  2. Асинхронность и ожидание с сопрограммами
  3. Шаблоны, подобные обещаниям
  4. Неблокирующий ввод-вывод с luasocket
← Назад к Lua Academy