LUA协程复用

原创 2015年07月10日 16:26:19
-----协程复用根函数

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);

Python 中进程、线程、协程、IO复用

进程、线程分别用到的模块是 multiprocessing.Process 和 threading.Thread 方法有 start() join() 等 同时在线程和进程中都可以调用 Que...

lua 在unity 中的协程使用

最近尝试在unity中用上lua。 而其中必然会遇到的一个问题就是

Lua协程(coroutine)的基本知识

有一个概念叫做coroutine, 也就是协程。协程究竟是什么呢,正式一点的说法: wiki : 协程是一种程序组件,是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的, ...

Lua基础之coroutine(协程)

概括:1.创建协程 2.coroutine的函数 3.coroutine的基本流程 4.yield对coroutine流程的干预 5.resume, function()以及yield之间的参数传递...

Lua语言学习之协程

coroutine

Lua协程

协程是非抢断式的多线程方式。 接口函数: 函数 参数 说明 coroutine.create f 创建协程 coroutine.resume co [, val1, ·...

lua学习笔记13:协程详解和举例

一、coroutine.create创建协程 参数是协程的主函数,返回一个thread对象 co = coroutine.create(function() print("coroutine e...

Lua 的协程 为什么会出现?

一开始大家想要同一时间执行那么三五个程序,大家能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机一样。于是就有了并发,从程序员的角度可以看成是多个独立的逻辑流。内部可以是多cpu并行,也...

lua和python利用协程实现消费-生产者问题

lua版本:--生产者,消费者模式-- --通过yield,resume配对实现,类似java的wait和notifyfunction send(x) coroutine.yield(x) e...

Lua的多任务机制——协程(coroutine)

转自:http://blog.csdn.net/soloist/article/details/329381     并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LUA协程复用
举报原因:
原因补充:

(最多只允许输入30个字)