Lua chapter 8 协同程序

1、协同程序,一个具有多个协同程序的程序在任意时刻,只能运行一个协同程序,

只有正在运行的协同程序被挂起时,它的执行才会暂停。

创建

co = coroutine.create(匿名函数);   -- 匿名函数就是线程要执行的东东

状态

coroutine.status(co);

唤醒

coroutine.resume(co);

挂起

coroutine.yield();

2、yield-resume 数据交换

function f(a,b)

coroutine.yield(a*10,b*10);

return "success";

end;

co = coroutine.create(f);

print (coroutine.resume(co,1,2));   --> true 10,20

print (coroutine.resume(co,1,2));   --> true success

3、消费者,生产者问题  producer and consumer

function receive()

local status, value = coroutine.resume(producer);

return value;

end;

function send(value)

coroutine.yield(value);

end;

--  set random seed

math.randomseed(os.time());

producer = coroutine.create(

function()

while true do

value = math.random(1000);

send(value);

end;

end

);

consumer = coroutine.create(

function()

while true do

print ("receive ? y or n");

if "y" == io.read() then

local value = receive();

print("receive: " .. value .."\n");

else

break;

end;

end;

end

);

coroutine.resume(consumer);

4、Lua的协同程序,在任意时刻只能有一个在执行,通过yield-resume来实现不同协同程序间的切换

function f1()

for i=1, 100 do

print("f1", i);

coroutine.yield();

end;

end;

function f2()

for i=1, 100 do

print("  f2", i);

coroutine.yield();

end;

end;

c1 = coroutine.create(f1);

c2 = coroutine.create(f2);

thread ={c1,c2};

function dispatch()

math.randomseed(os.time());

while true do

var = math.random(#thread);       -- 随机数,决定执行哪个协同程序

local status = coroutine.resume(thread[var]);

if status==false then       -- 如果一条协同程序执行完,则remove

print("thread dead");

table.remove(thread,var);

end;

if #thread == 0 then       -- 协同程序执行完,退出循环

break;

end;

end;

end;

dispatch();

Lua chapter 8 协同程序

时间: 2024-10-05 23:35:13

Lua chapter 8 协同程序的相关文章

Lua中的协同程序 coroutine

Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时刻只能有一个协程在运行.并且Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞. 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行).dead(函数走完后的状态,这时候不能再重新resume). coroutine

Lua中的协同程序 coroutine(转)

Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时刻只能有一个协程在运行.并且Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞. 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行).dead(函数走完后的状态,这时候不能再重新resume). coroutine

Lua中的协同程序

[前言] 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行.就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. [协同程序基础] Lua将所有关于协同程序的函数放置在一个名为"coroutine"的table中

lua程序设计之协同程序

本文的内容主要来自于<lua程序设计>一书,部分内容来自网络 一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 一 协同程序基础 -协同程序的函数放在"coroutine"的table中 -状态status -suspended 初始状态(创建时) -running -    dead -normal:当协程A唤醒协程B,A就处于normal状态 -coroutine函数 -coroutine.cr

lua学习之协同程序

转载:http://www.cnblogs.com/sifenkesi/p/3824321.html Lua中的协程和多线程很相似,每一个协程有自己的堆栈,自己的局部变量,可以通过yield-resume实现在协程间的切换.不同之处是:Lua协程是非抢占式的多线程,必须手动在不同的协程间切换,且同一时刻只能有一个协程在运行.并且Lua中的协程无法在外部将其停止,而且有可能导致程序阻塞. 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).r

Lua学习笔记之协同程序

1.  协同程序与多线程情况下的线程比较类似,有自己的堆栈.自己的局部变量,有自己的指令指针,但是和其他协同程序共享全局变量等很多信息.线程和协同程序的主要不同在于:在多核处理器情况下,多线程程序同时运行多个线程,而协同程序是通过协作来完成,在任意指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才被挂起. 2.  协同的基础 Lua通过table提供了所有的协同函数,create函数创建一个新的协同程序,create只有一个参数,协同程序将要运行的代码封装而

Lua之协同程序(coroutine)

什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常强大的功能,但是用起来也很复杂. 线程和协同程序区别 线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行. 在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起. 协同程序有点类似同步的多线程,在

《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记

例:编写一个迭代器,使其可以遍历某个数组的所有排列组合形式.代码如下: function permgen(a, n) n = n or #a -- 默认n为a的大小 if n <= 1 then -- 还需要改变吗? printResult(a) else for i=1,n do -- 将第一个元素放到数组末尾 a[n], a[i] = a[i], a[n] -- 生成其余元素的排列 permgen(a, n-1) -- 恢复第i个元素 a[n], a[i] = a[i], a[n] end

Lua语言基础汇总(7) -- 协同程序

前言 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行.就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 协同程序基础 Lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中.函数create