Перейти к содержимому
LeshaInc

Библиотека coroutine в Lua. Функции работы с сопрограммами. (гайд)

Рекомендуемые сообщения

COROUTINE

В Lua

 

Что?

Данный мини-гайд посвящен потокам (англ. thread) в Lua. Потоки - вещи нужные, очень активно используются во многих языках, в том числе и Lua.

При чем здесь coroutine? А при том что в Lua именно этот модуль отвечает за потоки.

Зачем?

Потоки широко используются в OpenComputers, он может вам очень хорошо пригодиться, к примеру вы можете организовать чтение из файла основанное на потоках. Перейдем к делу.

Как?

Как я и писал до этого, в Lua для использования потоков существует модуль coroutine. Начнем со скучной и непонятной теорией - методами этого модуля.

coroutine.create(func, ...) -- создает поток из функции, возвращает, как ни странно, поток.
coroutine.resume(thread, ...) -- продолжает (или запускает впервые) поток, возвращает инофрмацию "получилось или нет" и то что возвратила функция-поток (либо yield). Кроме потока принимает аргументы
coroutine.yield(...)  -- вызывается внутри функции-потока. Ставит поток на "паузу", поток можно продолжить методом resume. Принимает значения которые необхзодимо вернуть
coroutine.status(thread) -- выдает статус потока, статуса бывает два: suspended (приостановлено) и dead (мертво)

А теперь, проверим это на практике, в opencomputers.

 

Начнем с открытия интерпретатора Lua:

2OG91va.png?1

 

Теперь созадим функцию, в которой мы сначала напишем FIRST, потом затормозим поток, а потом напишем SECOND:

DN3tDTB.png?1

 

Создадим поток из нашей функции:

rtjUjV8.png?1

 

Убеждаемся что мы получили именно то что нам нужно - поток:

3vcrIjb.png?1

 

ssrJrAu.png?1

 

Хорошо, поток есть. Теперь давайте получим статус этого потока:

iMQXOhx.png?1

 

Приостановлен. Хорошо, давайте запустим его:

ZeqQ0Bq.png?1

 

Мы увидели надпись FIRST, но где-же надпись SECOND? А все потому, что мы притормозили поток после написания первого сообщения. Мы можем убедиться в этом, узнав его статус:

iMQXOhx.png?1

 

Наш поток приостановлен, а это значит что мы его можем продолжить:

k0QxQM9.png?1

 

Отлично. Поток закончен и дальше продолжать мы его не сможем. Можно убедиться в этом:

IHIcz0a.png?1

76h4OxJ.png?1

 

Что-ж, так и работает наш coroutine.

 

 

Спасибо за внимание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ой напортачил... А как же coroutine.wrap(func: function):function? А так же ещё два статуса: normal (когда поток запустил другой поток он становится normal) и running (поток запущен и работает)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ой напортачил... А как же coroutine.wrap(func: function):function? А так же ещё два статуса: normal (когда поток запустил другой поток он становится normal) и running (поток запущен и работает)?

Я описал только то, что работает и в CC, и в OC. Функции которые я описал были добавлены в версии 5.1, а твои функции в lua 5.2. А как мы знаем в CC - 5.1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я описал только то, что работает и в CC, и в OC. Функции которые я описал были добавлены в версии 5.1, а твои функции в lua 5.2. А как мы знаем в CC - 5.1

Неа, я только что проверил в CC, и как оказалось функция присутствует, также как coroutine.running().

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Неа, я только что проверил в CC, и как оказалось функция присутствует, также как coroutine.running().

Ну ок. Скажу честно... Я просто хз что делают те функции, на lua-users было описано только то что я написал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну ок. Скажу честно... Я просто хз что делают те функции, на lua-users было описано только то что я написал.

Так зачем копипастить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну тогда дополни с моих слов))

 

coroutine.wrap(func: function):function - создаёт тот же самый поток, но в виде функции. Естественно на такой поток нельзя использовать coroutine.status(), т.к. это функция, но зато его можно вызвать. Этот метод очень удобен для создания итераторов.

 

coroutine.running():thread - возвращает работающий поток (по логике это всегда поток, где была вызвана эта функция)

 

Про два недосказанных статуса я писал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так зачем копипастить?

Тама на английском.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...