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学习笔记13:协程详解和举例

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

Lua语言学习之协程

coroutine

Lua协程(coroutine)的基本知识

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

Lua基础之coroutine(协程)

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

Lua协程

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

Lua基础coroutine(协程)

1.创建协程 协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多...

lua--协程

前言协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可...

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

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

Lua 协程 coroutine

协程是协同程序的简称,顾名思义,就是协同工作的程序。协程拥有自己独立的桟、局部变量和PC计数器,同时又与其他协同程序共享全局变量和其他大部分东西;    协程与线程的主要区别在于,一个多线程程序可以同...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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