lua程序設計之協同程序

    本文的內容主要來自於《lua程序設計》一書,部份內容來自網絡windows

    一個具備多個協同程序的程序在任意時刻只能運行一個協同程序,而且正在運行的協同程序只會在其顯式地要求掛起時,它的執行纔會暫停。網絡

一 協同程序基礎多線程

    -協同程序的函數放在」coroutine」的table閉包

    -狀態status異步

    -suspended初始狀態(建立時)ide

    -running函數

    -deadlua

    -normal:當協程A喚醒協程BA就處於normal狀態spa

    -coroutine函數線程

    -coroutine.create(function)     參數爲函數,返回一個thread類型的值,表示新的協同程序。

    -coroutine.status(co)       參數爲協同程序,返回協程的狀態。

    -coroutine.resume(co)     參數爲協同程序,啓動或再次啓動一個協程,並將狀態由掛起改成運行。

    -coroutine.yield()  讓運行中的協程掛起,而以後再回復它的運行。

    注意:resume運行在保護模式下,所以,若是協同程序內部存在錯誤,Lua並不會拋出錯誤,而是將錯誤返回給resume函數。

    協同中的參數傳遞形勢很靈活,必定要注意區分,在啓動coroutine的時候,resume的參數是傳給主程序的;在喚醒yield的時候,參數是傳遞給yield的。----這讓我想起了閉包

    1resume能夠理解爲函數調用,而且能夠傳入參數,激活協同時,參數是傳給程序的,喚醒yield時,參數是傳遞給yield的。——這讓我想起了閉包

    2yield就至關因而一個特殊的return語句,只是它只是暫時性的返回(掛起),而且yield能夠像return同樣帶有返回參數,這些參數是傳遞給resume的。

二 協同程序的應用:管道與過濾器

    這是《lua程序設計》中的例子,其實就是上面(1)和(2),yield至關於return,而resume至關於函數調用。在coroutine.create()裏面yield返回數據,在須要用數據的時候resume調用。

三 協同程序的應用:迭代器

    同二。在遞歸裏面yield,複雜的是迭代器函數的建立。

四 非搶先式的多線程

    將全部協程加入一個一個列表,調度程序則循環遍歷全部的協程。當協程完成任務的時候,將該協程從列表中刪除。直到全部協程都完成。感受這裏的多線程與windows的分時複用有幾分類似。


    話說,以前在研究異步加載時候,在網上看到,協同程序也能夠實現異步加載,到底怎麼作到的呢?有沒有人告知?

相關文章
相關標籤/搜索