<Lua程序设计(第二版)>书摘-11

资料摘自<Lua程序设计(第二版)>

协同程序(coroutine)
  协同程序与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分手东西。从概念上讲线程与协同程序主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行都会暂停。
  Lua将所有关于协同程序的函数放置于一个名为"coroutine"的table中。函数create用于创建新的协同程序,它只有一个参数,就是一个函数。该函数的代码就是协同程序所需析执行的内容。create会返回一个thread类型的值,用以表示新的协同程序。通常create的参数是一个匿名函数,例如:
  local co = coroutine.create(function() print("hi") end)
  print(co)  -->thread: 000000000C7CDA50
  一个协同程序可以处于4种不同的状态:挂起(suspended)、运行(running)、死亡(dead)和正常(normal)。当创建一个协同程序时,它处于挂起状态。也就是说,协同程序不会在创建它时自动执行其内容,可以通过函数status来检查协同程序的状态:
  print(coroutine.status(co)) -->suspended
函数coroutine.resume用于启动或再次启动一个协同程序的执行,并将其状态由挂起改为运行:
  coroutine.resume(co)  -->hi
在上例中,协同程序只是简单地打印了"hi"便终止了,然后进入死亡状态:
print(coroutine.status(co)) -->dead
coroutine.yield()的使用:
local co = coroutine.create(function()
  for i=1,10 do
    print("co",i)
    coroutine.yield()
  end
end)
coroutine.resume(co)  -->co 1
coroutine.resume(co)  -->co 2
coroutine.resume(co)  -->co 3
...
coroutine.resume(co)  -->co 10
由上例可示,当唤醒一个协同程序时,它就会开始执行,直到碰上一个yield,此时检查其状态就会发现协同程序处于挂起状态:
print(coroutine.status(co)) -->suspended

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值