溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

lua程序設計之協(xié)同程序

發(fā)布時間:2020-07-01 15:09:13 來源:網絡 閱讀:1143 作者:firekido 欄目:開發(fā)技術

    本文的內容主要來自于《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的。----這讓我想起了閉包

    1resume可以理解為函數調用,并且可以傳入參數,激活協(xié)同時,參數是傳給程序的,喚醒yield時,參數是傳遞給yield的。——這讓我想起了閉包

    2yield就相當于是一個特殊的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é)同程序也可以實現異步加載,到底怎么做到的呢?有沒有人告知?

    


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI