Lua coroutine理解

来源:互联网 发布:弈乐麻将 嘉兴玩网络 编辑:程序博客网 时间:2024/05/03 11:36

(持续更新中.........)

Lua中的coroutine和go里面的goroutine,以及erlang中的spawn出一个新的进程的思想一致(erlang应该是他们的鼻祖)

coroutine中的coroutine.resume解释

函数原型:coroutine.resume(co, para1, para2, ...)

函数参数:

第一个参数co:coroutine.create的返回值,即一个thread对象;

第二个参数:coroutine中的主函数体执行需要的参数,是一个变长参数,可以传任意多个;

函数返回值:

如果程序运行没有任何错误的话,那么会返回true,true之后紧跟着的值是最近一次调用coroutine.yield时传入coroutine.yield的参数,可以有任意多个,

如果程序在运行中没有任何错误也没有遇到yield而正常结束,那么函数的返回值为true,后面跟上主函数的返回值(return后面的值)

如果有任何错误的话,就会返回false,后面紧跟上错误的信息

函数作用:

当第一次调用coroutine的resume方法时,coroutine从主函数的第一行开始执行,之后在coroutine开始运行后,它会一直运行到自身终止或者是coroutine的下一个yield函数


coroutine中的coroutine.yield解释:

函数原型:coroutine.yield(...)

函数参数:可变长参数

函数返回值:

返回最近一次调用coroutine.resume时传入的参数

函数作用:

挂起当前执行的协程,这个协程不能正在使用一个C函数、一个元表或者一个迭代器


lua的coroutine在执行coroutine.yield时的分析:

只要程序的执行流在遇到yield时,总是立马暂停,此时,coroutine的resume函数将yield的参数作为resume的返回值带出来;

当下一次执行resume的时候,执行体开始执行yield函数,其实就是对yield的函数调用进行求值,求值结果就是本次resume调用时的入参,这样yield就可以作为表达式将函数的求值结果赋给其他变量;

这也体现了resume和yield配合可以作为消息通信的通道的实质

消息传递的过程中,yield起到了关键作用,承上启下的作用。



0 0