Lua协同机制详解


写点简单的控制线程挂起的操作,coroutine.yield()这个函数的使用,从协同的观点看:使用函数yield可以使程序挂起,当我们激活被挂起的程序时,将从函数yield的位置继续执行程序,直到再次遇到yield或程序结束。首先我们先看一段代码,如下:

co = coroutine.create(function ()
 for i=1,10 do
  print("co",i)
  coroutine.yield()
 end
end)

coroutine.resume(co)
print(coroutine.status(co))

这段代码比较简单,高手就不用来这里,呵呵,偶也是一个初学者,大家新手入门的话可以关注本博客,随时查看一下这些内容,coroutine.yield()其中这句话负责将正在运行的东西挂起,我们打印出它的状态可以看到如下结果,如图:

然后我们再继续添加一些代码,代码如下:

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
print(coroutine.resume(co))

我们把已经结束的线程再继续的时候就出现以下情况,上面的代码只是为了展示给大家会出现什么结果,结果如下图:

我们可以看到最后打印出一个 :cannot resume dead coroutine(不能继续运行一个已经死亡的线程)。

注意:resume运行在保护模式下,因此,如果协同程序内部存在错误,Lua并不会抛出错误,而是将错误返回给resume函数。

  • 1
  • 2
  • 3
  • 下一页

相关内容