lua程序设计之协同程序-创新互联
本文的内容主要来自于《lua程序设计》一书,部分内容来自网络
成都创新互联-成都网站建设公司,专注成都网站建设、成都做网站、网站营销推广,域名注册,虚拟主机,网站运营有关企业网站制作方案、改版、费用等问题,请联系成都创新互联。一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停。
一 协同程序基础
-协同程序的函数放在”coroutine”的table中
-状态status
-suspended初始状态(创建时)
-running
-dead
-normal:当协程A唤醒协程B,A就处于normal状态
-coroutine函数
-coroutine.create(function) 参数为函数,返回一个thread类型的值,表示新的协同程序。
-coroutine.status(co) 参数为协同程序,返回协程的状态。
-coroutine.resume(co) 参数为协同程序,启动或再次启动一个协程,并将状态由挂起改为运行。
-coroutine.yield() 让运行中的协程挂起,而之后再回复它的运行。
注意:resume运行在保护模式下,因此,如果协同程序内部存在错误,Lua并不会抛出错误,而是将错误返回给resume函数。
协同中的参数传递形势很灵活,一定要注意区分,在启动coroutine的时候,resume的参数是传给主程序的;在唤醒yield的时候,参数是传递给yield的。----这让我想起了闭包
(1)resume可以理解为函数调用,并且可以传入参数,激活协同时,参数是传给程序的,唤醒yield时,参数是传递给yield的。——这让我想起了闭包
(2)yield就相当于是一个特殊的return语句,只是它只是暂时性的返回(挂起),并且yield可以像return一样带有返回参数,这些参数是传递给resume的。
二 协同程序的应用:管道与过滤器
这是《lua程序设计》中的例子,其实就是上面(1)和(2),yield相当于return,而resume相当于函数调用。在coroutine.create()里面yield返回数据,在需要用数据的时候resume调用。
三 协同程序的应用:迭代器
同二。在递归里面yield,复杂的是迭代器函数的创建。
四 非抢先式的多线程
将所有协程加入一个一个列表,调度程序则循环遍历所有的协程。当协程完成任务的时候,将该协程从列表中删除。直到所有协程都完成。感觉这里的多线程与windows的分时复用有几分相似。
话说,之前在研究异步加载时候,在网上看到,协同程序也可以实现异步加载,到底怎么做到的呢?有没有人告知?
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站名称:lua程序设计之协同程序-创新互联
网站地址:http://ybzwz.com/article/eheds.html