Lua協(xié)同程序coroutine的簡介及優(yōu)缺點
什么是協(xié)同(coroutine)?
Lua 協(xié)同程序(coroutine)與線程比較類似:擁有獨立的堆棧,獨立的局部變量,獨立的指令指針,同時又與其它協(xié)同程序共享全局變量和其它大部分東西。
協(xié)同是非常強大的功能,但是用起來也很復(fù)雜。
線程和協(xié)同程序區(qū)別
協(xié)程是編譯器級別的,線程是操作系統(tǒng)級別的,在多處理器情況下,多線程程序同時運行多個線程;而協(xié)同程序是通過協(xié)作來完成,在任一指定時刻只有一個協(xié)同程序在運行,并且這個正在運行的協(xié)同程序只在必要時才會被掛起。這樣Lua的協(xié)程就不能利用現(xiàn)在多核技術(shù)了。
coroutine優(yōu)缺點分析
上面對coroutine有個基本的了解,因此大家都會象我一樣去想,為什么要用coroutine?先研究下優(yōu)點
- 每個coroutine有自己私有的stack及局部變量。
- 同一時間只有一個coroutine在執(zhí)行,無需對全局變量加鎖。
- 順序可控,完全由程序控制執(zhí)行的順序。而通常的多線程一旦啟動,它的運行時序是沒法預(yù)測的,因此通常會給測試所有的情況帶來困難。所以能用coroutine解決的場合應(yīng)當(dāng)優(yōu)先使用coroutine。
再看缺點,研究coroutine缺點之前,我尋找了一下Lua中為什么實現(xiàn)coroutine的一些說明。在巴西人寫的paper Coroutines in Lua(pdf)中解釋了幾個原因:
- Lua是ANSI C實現(xiàn)的,ANSI C并不包含thread的實現(xiàn),因此如果要在Lua增加thread的支持就要使用操作系統(tǒng)本地的實現(xiàn),這樣會造成通用的問題。同時也會使Lua變得臃腫。因此Lua選擇了在ANSI C上實現(xiàn)的coroutine。
- Lua主要設(shè)計目的之一是給C調(diào)用,如果Lua內(nèi)部又有多線程實現(xiàn)的話會造成C調(diào)用狀態(tài)的混亂,而只提供coroutine層面的掛起則可以保持狀態(tài)的一致性。
以上這些理由都是基于Lua特殊的原因而使用的,并不是很通用的原因。我們也了解到,coroutine實際上是一種古老的設(shè)計模式,它在60年代就已經(jīng)定型,但是現(xiàn)代語言很少有重視這個特性,目前可以舉例的有Windows的fibers, Python的generators
基本語法:
簡例:
--定義協(xié)同函數(shù) (匿名函數(shù)) cor = coroutine.create( function(a,b) print(a+b) coroutine.yield() --掛起 print(a-b) end ) --調(diào)用協(xié)同函數(shù),,(暫停、繼續(xù)) res=coroutine.resume(cor,10,20) --接收的參數(shù)第一個是是否成功執(zhí)行,后面的才是協(xié)程運行的返回值 print(res) print("Czhenya的協(xié)程") --繼續(xù)運行協(xié)程,不需要傳遞參數(shù),即使傳遞也只使用第一次傳的參數(shù) coroutine.resume(cor) --協(xié)程的狀態(tài) suspended(掛起,暫停) running(運行) date(死亡,結(jié)束) print(coroutine.status(cor)) --協(xié)程運行完成后不能再次啟動 coroutine.resume(cor) --[[ 輸出是 : 30 true Czhenya的協(xié)程 -10 dead --]]
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對本站的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。