您好,登錄后才能下訂單哦!
本文的內容主要來自于《lua程序設計》一書,部分內容來自網絡
一個具有多個協(xié)同程序的程序在任意時刻只能運行一個協(xié)同程序,并且正在運行的協(xié)同程序只會在其顯式地要求掛起時,它的執(zhí)行才會暫停。
一 協(xié)同程序基礎
-協(xié)同程序的函數放在”coroutine”的table中
-狀態(tài)status
-suspended初始狀態(tài)(創(chuàng)建時)
-running
-dead
-normal:當協(xié)程A喚醒協(xié)程B,A就處于normal狀態(tài)
-coroutine函數
-coroutine.create(function) 參數為函數,返回一個thread類型的值,表示新的協(xié)同程序。
-coroutine.status(co) 參數為協(xié)同程序,返回協(xié)程的狀態(tài)。
-coroutine.resume(co) 參數為協(xié)同程序,啟動或再次啟動一個協(xié)程,并將狀態(tài)由掛起改為運行。
-coroutine.yield() 讓運行中的協(xié)程掛起,而之后再回復它的運行。
注意:resume運行在保護模式下,因此,如果協(xié)同程序內部存在錯誤,Lua并不會拋出錯誤,而是將錯誤返回給resume函數。
協(xié)同中的參數傳遞形勢很靈活,一定要注意區(qū)分,在啟動coroutine的時候,resume的參數是傳給主程序的;在喚醒yield的時候,參數是傳遞給yield的。----這讓我想起了閉包
(1)resume可以理解為函數調用,并且可以傳入參數,激活協(xié)同時,參數是傳給程序的,喚醒yield時,參數是傳遞給yield的。——這讓我想起了閉包
(2)yield就相當于是一個特殊的return語句,只是它只是暫時性的返回(掛起),并且yield可以像return一樣帶有返回參數,這些參數是傳遞給resume的。
二 協(xié)同程序的應用:管道與過濾器
這是《lua程序設計》中的例子,其實就是上面(1)和(2),yield相當于return,而resume相當于函數調用。在coroutine.create()里面yield返回數據,在需要用數據的時候resume調用。
三 協(xié)同程序的應用:迭代器
同二。在遞歸里面yield,復雜的是迭代器函數的創(chuàng)建。
四 非搶先式的多線程
將所有協(xié)程加入一個一個列表,調度程序則循環(huán)遍歷所有的協(xié)程。當協(xié)程完成任務的時候,將該協(xié)程從列表中刪除。直到所有協(xié)程都完成。感覺這里的多線程與windows的分時復用有幾分相似。
話說,之前在研究異步加載時候,在網上看到,協(xié)同程序也可以實現異步加載,到底怎么做到的呢?有沒有人告知?
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。