Реальное использование Lua сопрограмм / сериализации продолжения для упрощения асинхронной логики? - PullRequest
5 голосов
/ 08 марта 2011

Библиотека Плутона для Lua утверждает, что может сериализовать сопрограммы Lua.Я интерпретирую это как означающее «сериализуемые продолжения», что является важной особенностью для обеспечения возможности асинхронного программирования для записи в синхронном стиле.

Например, рабочий процесс может быть выражен линейно, а не требовать именованных точек входа

if (ask user is hungry) then
     if (not ask user is vegetarian) then
       if (ask user if likes_burgers) then
          feed_user(burger)
       else
          tell_user("Picky!")
     else
       feed_user(salad)

вместо

function main()
   ask(user is hungry, "hungry_response")

function hungry_response(answer)
  if (answer is yes)
     ask(user is vegetarian, "vegetarian_response")

function vegetarian_response(answer)
  if (answer is yes)
     feed_user(salad)
  else
     ask(user likes burgers, "burgers_response")

function burgers_response(answer)
  if (answer is yes) then
    feed_user(burger)
  else
    tell_user("Picky!")

Хотя операторы, переведенные в предыдущий стиль, неплохие, все становится очень сложно, если вы задействуете локальные переменные, циклы, вызовы вложенных функций и т. Д.

Здесь сериализуемые продолжения становятся критически важными.

Сериализованные продолжения используются в JavaFlow, Cocoon (Rhink), Seaside, PLT Scheme, SICS и отлично подходят для работы с бизнесом.рабочие процессы, медицинская диагностика и (в моем случае) текстовые приключенческие игры.

Есть ли примеры (надеюсь, с открытым исходным кодом!) Того, как Луа и Плутон используют свои возможности таким образом, используя продолжения для упрощения логики в асинхронной среде?

1 Ответ

3 голосов
/ 18 марта 2011

http://sheddingbikes.com/posts/1289384533.html

http://dpaste.de/Huj4/

Например, посмотрите Tir из WKP («известный программист»). Это упрощает, если не сериализует, асинхронные операции. Это лицензированный BSD фреймворк для микро-сетей, использующий сопрограммы Lua.

Из блога ...

Магия, которая делает эту работу Сопрограммы Луа. На каждом из точки, где мы называем веб: подсказка и веб: нажмите двигатель Tir дает наш обработчик, сохраняет его на потом, а затем новый запрос возвращает его. Код что делает это в основном:

function Web:recv()
    return coroutine.yield()
end
...