Можете помочь с объяснением программы?

Читал о много поточности в LUA, и наткнулся на программу которая работает, но не понимаю тонкости ее действий.
*******************************************
function consumer ()
  while true do
    local x = receive();
    io.write(x, "\n");
  end;
end;

function receive ()
  local status, value = coroutine.resume(producer);
  return value;
end;

function send (x)
  coroutine.yield(x);
end;

producer = coroutine.create(
  function ()
    while true do
      local x = io.read();
      send(x);
    end;
  end);

consumer()

*******************************************
В этой программе я не понимаю, как происходит действия, когда consumer() вызывает receive() после идет вызов producer и тут не понимаю что происходит?
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
angru
@angru
https://ru.wikipedia.org/wiki/Сопрограмма

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

алгоритм такой(представим, что код функций send и receive расположен в там, где их вызывают, просто чтобы мне писать меньше):
1. консьюмер в цикле вызывает сопрограмму "продюсер"
2. продюсер получает данные
3. с помощью yield возвращает данные в кнсьюмера(это как return, только с возможностью потом продолжить выполнение сопрограммы с этого места)
4. консьюмер выводит данные и опять вызывает сопрограмму(шаг 1. т.к. бесконечный цикл) с того места, где она остановилась(а там тоже бесконечный цикл, шаг 2)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы