协程

lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中。

create  ///创建新的协同程序

例:

co = coroutine.create(function () print("hi")  end)

print(co)  --> thread: 0x8071d98

一个协程可以处于4种不同的状态:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)。创建一个协程时,它处于挂起状态。也就是说协程在被创建时不会自动执行其内容。可以通过status来检查协程状态:

print(coroutine.status(co))  -->suspended

resume用于启动或再启动一个协程的执行,并将其状态由挂起改为运行:

coroutine.resume(co)   -->hi

由于创建的协程只是简单的print,上面语句结束后就处于死亡状态,无法返回了

print(coroutine(co))  -->dead

yield:可以让一个运行中的协程挂起,再之后可以恢复它的运行。

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

现在唤醒它时,它将执行到第一个yield:

coroutine.resume(co)  -->co 1

此时检查其状态,可以发现协程处于挂起状态,因此可以再次恢复运行:

print(coroutine.status(co))  -->suspended

只有恢复了协程的执行时,yield调用才最终返回,然后协程继续执行,直到下一个yield或执行结束:

coroutine.resume(co)  -->co 2
coroutine.resume(co)  -->co 3
...

最后一次调用协程时,协程内容已经执行完毕并已返回,如果再尝试恢复它的执行,resume将返回false及一条错误信息。

协程A唤醒另一个协程B时,A的状态既不是挂起,也不是结束,称为正常状态。

你可能感兴趣的:(协程)