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

总结

协同流程类似于线程,又区别于线程,协同流程之间可以切换运行,即任何时候都可以挂起和切换一个协同流程到另外一个协同流程。