Lua 協(xié)同程序(coroutine)與線程比較類似:擁有獨立的堆棧,獨立的局部變量,獨立的指令指針,同時又與其它協(xié)同程序共享全局變量和其它大部分東西。
創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設服務,提供成都網(wǎng)站建設、成都做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設計,成都響應式網(wǎng)站建設公司,網(wǎng)頁設計師打造企業(yè)風格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務。歡迎咨詢做網(wǎng)站需要多少錢:18982081108協(xié)同是非常強大的功能,但是用起來也很復雜。
線程與協(xié)同程序的主要區(qū)別在于,一個具有多個線程的程序可以同時運行幾個線程,而協(xié)同程序卻需要彼此協(xié)作的運行。
在任一指定時刻只有一個協(xié)同程序在運行,并且這個正在運行的協(xié)同程序只有在明確的被要求掛起的時候才會被掛起。
協(xié)同程序有點類似同步的多線程,在等待同一個線程鎖的幾個線程有點類似協(xié)同。
方法 | 描述 |
---|---|
coroutine.create() | 創(chuàng)建coroutine,返回coroutine, 參數(shù)是一個函數(shù),當和resume配合使用的時候就喚醒函數(shù)調(diào)用 |
coroutine.resume() | 重啟coroutine,和create配合使用 |
coroutine.yield() | 掛起coroutine,將coroutine設置為掛起狀態(tài),這個和resume配合使用能有很多有用的效果 |
coroutine.status() | 查看coroutine的狀態(tài) 注:coroutine的狀態(tài)有三種:dead,suspend,running,具體什么時候有這樣的狀態(tài)請參考下面的程序 |
coroutine.wrap() | 創(chuàng)建coroutine,返回一個函數(shù),一旦你調(diào)用這個函數(shù),就進入coroutine,和create功能重復 |
coroutine.running() | 返回正在跑的coroutine,一個coroutine就是一個線程,當使用running的時候,就是返回一個corouting的線程號 |
function foo(a) print("foo 函數(shù)輸出 ",a) -- 返回2*a的值 return coroutine.yield(2 * a) end co = coroutine.create(function (a,b) --cp-body 1 10 print("第一次協(xié)同程序執(zhí)行輸出 ", a,b) local r = foo(a + 1) print("第二次協(xié)同程序輸出 ",r) --a,b的值為第一次調(diào)用協(xié)同程序時傳入 local r,s = coroutine.yield(a+b, a - b) print("第三次協(xié)同程序輸出 ",r,s) --b的值為第二次調(diào)用協(xié)同程序時傳入 return b,"結(jié)束協(xié)同程序" end) print("---------------分割線---------------"); print("main", coroutine.resume(co,1,10)) --true 4 print("協(xié)同程序的狀態(tài): ",coroutine.status(co)) print("---------------分割線---------------"); print("main", coroutine.resume(co,"r")) --true 4 print("協(xié)同程序的狀態(tài): ",coroutine.status(co)) print("---------------分割線---------------"); print("main", coroutine.resume(co,"x","y")) --true 4 print("協(xié)同程序的狀態(tài): ",coroutine.status(co)) print("---------------分割線---------------"); print("main", coroutine.resume(co,"x","y")) --true 4 print("協(xié)同程序的狀態(tài): ",coroutine.status(co)) print("---------------分割線---------------");
以上實例接下如下:
調(diào)用resume,將協(xié)同程序喚醒,resume操作成功返回true,否則返回false;
協(xié)同程序運行;
運行到y(tǒng)ield語句;
yield掛起協(xié)同程序,第一次resume返回;(注意:此處yield返回,參數(shù)是resume的參數(shù))
第二次resume,再次喚醒協(xié)同程序;(注意:此處resume的參數(shù)中,除了第一個參數(shù),剩下的參數(shù)將作為yield的參數(shù))
yield返回;
協(xié)同程序繼續(xù)運行;
如果使用的協(xié)同程序繼續(xù)運行完成后繼續(xù)調(diào)用 resume方法則輸出:cannot resume dead coroutine
resume和yield的配合強大之處在于,resume處于主程中,它將外部狀態(tài)(數(shù)據(jù))傳入到協(xié)同程序內(nèi)部;而yield則將內(nèi)部的狀態(tài)(數(shù)據(jù))返回到主程中。
=============================================================================
現(xiàn)在我就使用Lua的協(xié)同程序來完成生產(chǎn)者-消費者這一經(jīng)典問題。
local newProductor function productor() local i= 0; while true do i = i + 1; send(i) -- 將生產(chǎn)的物品發(fā)給消費者 end end function consume() i = 0 while (i < 10) -- 控制大小 do i = i + 1 local i = receive() --從生產(chǎn)者那里得到物品 print(i) end end function receive() local status , value = coroutine.resume(newProductor) return value end function send(x) --x表示需要發(fā)生的值,值返回以后,就掛起該協(xié)同程序 coroutine.yield(x) end -- 啟動程序 newProductor = coroutine.create(productor) consume()
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站名稱:Lua之協(xié)同程序(coroutine)-創(chuàng)新互聯(lián)
文章起源:http://m.rwnh.cn/article40/djooeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、靜態(tài)網(wǎng)站、網(wǎng)站維護、外貿(mào)網(wǎng)站建設、ChatGPT、面包屑導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容