LUA协程复用

Posted mfmdaoyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LUA协程复用相关的知识,希望对你有一定的参考价值。

-----协程复用根函数

local function routine(fun, args)
    while (fun) do
        fun, args = coroutine.yield(fun(table.unpack(args)));
    end
end

-----demo 1 : 使用一个协程,用来调用不同的參数和不同的函数

local Sum = function(...)
    local sum = 0;
    for i=1, select("#", ...) do
        sum = sum + select(i, ...);
    end
    return sum;
end

local Avg = function(...)
    local N = select("#", ...);
    if 0==N then
        return 0;
    else
        return Sum(...) / N;
    end
end

local co = coroutine.create(routine);

print(coroutine.resume(co, Sum, {}));
print(coroutine.resume(co, Sum, {1}));
print(coroutine.resume(co, Sum, {1,2}));
print(coroutine.resume(co, Sum, {1,2,3}));

print(coroutine.resume(co, Avg, {}));
print(coroutine.resume(co, Avg, {1}));
print(coroutine.resume(co, Avg, {1,2}));
print(coroutine.resume(co, Avg, {1,2,3}));

print();
print();

-----demo 2 : 创建A和B两个协程。用不同的用户来反复调用

-----多阶段登录函数
local Login = function(user, pass)
    print(user .. " step1");
    coroutine.yield();

    print(user .. " step2");
    coroutine.yield();

    print(user .. " step3");
    coroutine.yield();

    print(user .. " step4");
    coroutine.yield();

    if (user == pass) then
        print(user .. " succ");
    else
        print(user .. " fail");
    end
end

-----创建两个协程: A和B
local coA = coroutine.create(routine);
local coB = coroutine.create(routine);

-----将user1。user2的信息传递给登录Login函数,模拟事件先后分发函数调用
print();
coroutine.resume(coA, Login, {"user1", "user1"});
coroutine.resume(coB, Login, {"user2", "test2"});

print();
coroutine.resume(coA);
coroutine.resume(coA);

print();
coroutine.resume(coB);
coroutine.resume(coB);

print();
coroutine.resume(coB);
coroutine.resume(coA);

print();
coroutine.resume(coB);
coroutine.resume(coA);

print();
print();
-----复用协程A和B,对user3,user4进行调用

print();
coroutine.resume(coA, Login, {"user3", "test3"});
coroutine.resume(coB, Login, {"user4", "user4"});

print();
coroutine.resume(coA);
coroutine.resume(coA);

print();
coroutine.resume(coB);
coroutine.resume(coB);

print();
coroutine.resume(coB);
coroutine.resume(coA);

print();
coroutine.resume(coB);
coroutine.resume(coA);

以上是关于LUA协程复用的主要内容,如果未能解决你的问题,请参考以下文章

ngx_lua 模块

ngx_lua 模块详细讲解

Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

Nginx-ngx_lua模块原理和内置函数

lua协程实现

[xlua]探索笔记之协程