Создание простого цикла событий
Реализуйте планировщик сопрограмм с очередью выполнения и циклом возобновления.
«Создание простого цикла событий» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Создание простого цикла событий
- Асинхронность и ожидание с сопрограммами
- Шаблоны, подобные обещаниям
- Неблокирующий ввод-вывод с luasocket