本文的內容主要來自於《lua程序設計》一書,部份內容來自網絡windows
一個具備多個協同程序的程序在任意時刻只能運行一個協同程序,而且正在運行的協同程序只會在其顯式地要求掛起時,它的執行纔會暫停。網絡
一 協同程序基礎多線程
-協同程序的函數放在」coroutine」的table中閉包
-狀態status異步
-suspended初始狀態(建立時)ide
-running函數
-deadlua
-normal:當協程A喚醒協程B,A就處於normal狀態spa
-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的分時複用有幾分類似。
話說,以前在研究異步加載時候,在網上看到,協同程序也能夠實現異步加載,到底怎麼作到的呢?有沒有人告知?