Я люблю Lua. I love Lua.

Сопрограммы(coroutines)

Posted in Uncategorized by ilovelua on 2 февраля, 2012

Автор Валерий Блажнов.

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

комментария 3

Subscribe to comments with RSS.

  1. Dmitry said, on 2 апреля, 2012 at 9:29 дп

    Спасибо, таки разобрался наконец с coroutines’ами. Четко и понятно.

  2. 0ccam said, on 5 апреля, 2012 at 9:39 пп

    Статья — вода. Ни о чём конкретно не рассказано. Википедия даёт больше информации о сопрограммах, хотя и в общих чертах.

    • Rean said, on 23 августа, 2012 at 4:47 пп

      Зато коротко, ясно и на практике.


Оставьте комментарий