Сопрограммы(coroutines)
Автор Валерий Блажнов.
Сопрограмма — это обертка вокруг функции, выполнение которой
может приостанавливаться ею с возвратом промежуточных результатов
и затем продолжаться вызывающей программой с передачей новых
значений параметров. В Lua функции работы с сопрограммами
представлены в стандартной библиотеке coroutine.
Применение сопрограмм может оказаться полезным в циклических программах.
Например, в игровых программах работает основной цикл отрисовки кадров,
между шагами которого производится обработка ввода от пользователя,
моделирование и другая работа. Поскольку отрисовка кадров должна производиться
равномерно с частотой порядка 25 кадров в секунду, то выполнение
продолжительных вычислений между кадрами недопустимо.
Механизм сопрограмм позволяет «размазать» выполнение алгоритма продолжительной функции
мелкими порциями между шагами основного цикла. В данном примере алгоритм функции f
разбит на три шага с возвратом управления после каждого шага. В каждом шаге основного
цикла программы производится продолжение выполнения сопрограммы, если она еще не
завершила работу окончательно.
function f(x) local step = 1 print("Coroutine starting step = "..step.." with x = "..x) -- ... -- Возврат управления, промежуточных результатов -- и ожидание продолжения выполнения. x = coroutine.yield(step) step = step + 1 print("Coroutine intermediate step = "..step.." with x = "..x) -- ... -- Возврат управления, промежуточных результатов -- и ожидание продолжения выполнения. x = coroutine.yield(step) step = step + 1 print("Coroutine finishing step = "..step.." with x = "..x) -- ... -- Завершение выполнения и возврат результатов return step end n = 5 -- Создание сопрограммы cr = coroutine.create(f) -- Основной цикл программы for i=1,n do print("Main cycle "..i) -- Если сопрограмма "жива", то продолжаем ее работу if coroutine.status(cr) ~= "dead" then -- Продолжение выполнения сопрограммы с передачей параметров -- и получение возвращаемых результатов. b,res = coroutine.resume(cr, i) print("Coroutine results in main cycle: b = ", b,", res = " ,res) end -- ... end
Результаты выполнения:
Main cycle 1
Coroutine starting step = 1 with x = 1
Coroutine results in main cycle: b = true , res = 1
Main cycle 2
Coroutine intermediate step = 2 with x = 2
Coroutine results in main cycle: b = true , res = 2
Main cycle 3
Coroutine finishing step = 3 with x = 3
Coroutine results in main cycle: b = true , res = 3
Main cycle 4
Main cycle 5
Спасибо, таки разобрался наконец с coroutines’ами. Четко и понятно.
Статья — вода. Ни о чём конкретно не рассказано. Википедия даёт больше информации о сопрограммах, хотя и в общих чертах.
Зато коротко, ясно и на практике.