Сопрограммы в Lua — это легкие потоки, которые имеют одно и то же глобальное состояние, но имеют независимое пространство стека. Сопрограммы обеспечивают неблокирующую многозадачность в Lua без необходимости планирования потоков операционной системой. Это делает сопрограммы очень подходящими для реализации таких сценариев, как таймеры, сетевые запросы, асинхронный ввод-вывод и т. д.
Lua Сопрограмма использует coroutine
модули для создания и управления. Ниже рассказывается о Lua В конце статьи приведены некоторые основные понятия и использование сопрограмм, демо-версия таймера;
использовать coroutine.create
функция для создания новой сопрограммы. Эта функция принимает функцию в качестве параметра и возвращает объект сопрограммы.
lualocal function myCoroutine()
print("Inside coroutine")
end
local co = coroutine.create(myCoroutine)
использовать coroutine.resume
Функция возобновления приостановленной сопрограммы. Когда сопрограмма возобновляется, она продолжает выполнение с того места, где она была в последний раз приостановлена, пока не встретит coroutine.yield
или вернуться.
lua-- Возобновить сопрограмму
coroutine.resume(co)
coroutine.status
Функция используется для получения текущего состояния сопрограммы. Возможные состояния: "running"
(сопрограмма Бег)、"suspended"
(сопрограмма Приостановленный)и "normal"
(сопрограмма Завершено выполнение)。
lualocal status = coroutine.status(co)
print(status) -- выходсопрограммастатус
coroutine.yield
Функция используется для активного отказа от прав управления в сопрограмме и возврата прав выполнения вызывающей стороне. coroutine.resume
код. Это позволяет выполнять неблокирующие операции, такие как ожидание ввода пользователя или ожидание ответа сети.
luafunction myCoroutine()
print("Before yield")
coroutine.yield()
print("After yield")
end
local co = coroutine.create(myCoroutine)
coroutine.resume(co) -- выход "Before yield" и пауза
coroutine.resume(co) -- восстановить и из yield продолжить после,выход "After yield"
сопрограмма может возвращать значение так же, как и обычная функция. Когда сопрограмма вернется,coroutine.resume
вернется true
И значение, возвращаемое сопрограммой.
luafunction myCoroutine()
return "Hello from coroutine"
end
local co = coroutine.create(myCoroutine)
local success, result = coroutine.resume(co)
if success then
print(result) -- выход "Hello from coroutine"
end
Сопрограмма может выполняться несколько раз за время своего существования. yield
,каждый раз yield
вернет управление вызывающей стороне до тех пор, пока сопрограмма не будет вызвана снова resume
。
luafunction myCoroutine()
for i = 1, 3 do
print("Count:", i)
coroutine.yield()
end
end
local co = coroutine.create(myCoroutine)
for i = 1, 3 do
coroutine.resume(co)
end
Основная нить (или «корневая сопрограмма») также является сопрограммой, поэтому ее можно использовать coroutine.yield
передать управление, хотя это, как правило, не очень хорошая идея, поскольку при этом останавливается выполнение всей программы.
coroutine.yield
В сопрограмме может быть более одного, используемого для приостановки и возобновления выполнения в разных точках сопрограммы.посредством разумногоиспользоватьсопрограмма,Lua Программы обеспечивают эффективное и управляемое параллельное выполнение.
обертка — функция, эквивалентная coroutine.resume(co,timeCnt)
timer = {}
local getTime = os.time
local nextTime = 0
local currentTime = 0
local timeCnt = 0
function timer.IntervalFunc()
while timeCnt > 0 do
while nextTime > currentTime
do
if currentTime ~= getTime() then
currentTime = getTime()
end
end
nextTime = getTime() + 1
timeCnt = timeCnt - 1
print(timeCnt+1)
end
end
function timer.StartTimer(default_vaule)
timeCnt = default_vaule
nextTime = getTime() + 1
-- local co = coroutine.create(timer.IntervalFunc)
-- coroutine.resume(co,timeCnt)
coroutine.wrap(timer.IntervalFunc,timeCnt)()
end
timer.StartTimer(3)
return timer