什么是協(xié)同(coroutine)?
Lua 協(xié)同程序(coroutine)與線程比較類似:擁有獨立的堆棧绽昼,獨立的局部變量,獨立的指令指針,同時又與其它協(xié)同程序共享全局變量和其它大部分東西沙合。
協(xié)同是非常強大的功能,但是用起來也很復雜跌帐。
線程和協(xié)同程序區(qū)別
線程與協(xié)同程序的主要區(qū)別在于首懈,一個具有多個線程的程序可以同時運行幾個線程,而協(xié)同程序卻需要彼此協(xié)作的運行谨敛。
在任一指定時刻只有一個協(xié)同程序在運行究履,并且這個正在運行的協(xié)同程序只有在明確的被要求掛起的時候才會被掛起。
協(xié)同程序有點類似同步的多線程佣盒,在等待同一個線程鎖的幾個線程有點類似協(xié)同挎袜。
基本語法
以下實例演示了以上各個方法的用法:
以上實例執(zhí)行輸出結(jié)果為:
coroutine.running就可以看出來,coroutine在底層實現(xiàn)就是一個線程。
當create一個coroutine的時候就是在新線程中注冊了一個事件肥惭。
當使用resume觸發(fā)事件的時候盯仪,create的coroutine函數(shù)就被執(zhí)行了,當遇到y(tǒng)ield的時候就代表掛起當前線程蜜葱,等候再次resume觸發(fā)事件全景。
接下來我們分析一個更詳細的實例:
以上實例執(zhí)行輸出結(jié)果為:
以上實例接下如下:
調(diào)用resume,將協(xié)同程序喚醒,resume操作成功返回true牵囤,否則返回false爸黄;
協(xié)同程序運行滞伟;
運行到y(tǒng)ield語句;
yield掛起協(xié)同程序炕贵,第一次resume返回梆奈;(注意:此處yield返回,參數(shù)是resume的參數(shù))
第二次resume称开,再次喚醒協(xié)同程序亩钟;(注意:此處resume的參數(shù)中,除了第一個參數(shù)鳖轰,剩下的參數(shù)將作為yield的參數(shù))
yield返回清酥;
協(xié)同程序繼續(xù)運行;
如果使用的協(xié)同程序繼續(xù)運行完成后繼續(xù)調(diào)用 resume方法則輸出:cannot resume dead coroutine
resume和yield的配合強大之處在于蕴侣,resume處于主程中焰轻,它將外部狀態(tài)(數(shù)據(jù))傳入到協(xié)同程序內(nèi)部;而yield則將內(nèi)部的狀態(tài)(數(shù)據(jù))返回到主程中昆雀。
生產(chǎn)者-消費者問題
現(xiàn)在我就使用Lua的協(xié)同程序來完成生產(chǎn)者-消費者這一經(jīng)典問題辱志。
以上實例執(zhí)行輸出結(jié)果為:
內(nèi)容來自:runoob.com 菜鳥教程
整理:極動云,寧波家電物聯(lián)網(wǎng)云平臺
CONTACT US: http://www.iot-jd.com