Lua 协同
Lua 支持协同流程开发,与 PHP 最大的不同,有一定的复杂性,需要慢慢细心体会。
简单演示
cf = coroutine.create(function ()
local count = 1;
while true do
coroutine.yield(count)
count = count + 1
end
end)
for i = 1, 10 do
print("协同调用第", i, "次:")
print(coroutine.resume(cf))
end
输出:
协同调用第 1 次:
true 1
协同调用第 2 次:
true 2
协同调用第 3 次:
true 3
协同调用第 4 次:
true 4
协同调用第 5 次:
true 5
协同调用第 6 次:
true 6
协同调用第 7 次:
true 7
协同调用第 8 次:
true 8
协同调用第 9 次:
true 9
协同调用第 10 次:
true 10
复杂一点演示
cf = coroutine.create(function (...)
local args = {...};
while true do
print("参数个数: ", #args, "参数: ", table.concat(args, ', '))
args = {coroutine.yield(#args)}
end
end)
print("返回数据:", coroutine.resume(cf))
print("返回数据:", coroutine.resume(cf, "a"))
print("返回数据:", coroutine.resume(cf, "a", "b"))
print("返回数据:", coroutine.resume(cf, "a", "b", "c"))
输出:
协同调用第 1 次:
true 1
协同调用第 2 次:
true 2
协同调用第 3 次:
true 3
协同调用第 4 次:
true 4
协同调用第 5 次:
true 5
协同调用第 6 次:
true 6
协同调用第 7 次:
true 7
协同调用第 8 次:
true 8
协同调用第 9 次:
true 9
协同调用第 10 次:
true 10
总结
协同流程类似于线程,又区别于线程,协同流程之间可以切换运行,即任何时候都可以挂起和切换一个协同流程到另外一个协同流程。