亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua中的協同程序探究

2024-07-21 23:04:02
字體:
來源:轉載
供稿:網友

哎,周五晚上我都還這么努力看書,真是好孩子。(小若:不想吐槽了)

其實我都準備玩游戲看電影去的了,但是這書就擺在桌子上,而且正對著我,就想著,掃兩眼吧。

結果一掃就不對勁了,因為這內容有點繞,有點小混亂,如果我現在不記錄下來的話,下周一可能又要重新看一次了。
 
好吧,今天我們來聊聊協同程序。

1.什么是協同程序(coroutinue)

大家都知道線程吧?都知道多線程吧?協同程序就和這線程差不多,但是又有比較明顯的區別。

多個協同程序在任意時刻只能執行一個,雖然線程在某種意義上也是這樣,但這不是一樣的概念。

換句話說,一個協同程序在運行的時候,其他協同程序是無法獲得執行的機會的。
只有正在運行的協同程序主動掛起時,其他協同程序才有機會執行。
 
而線程呢?即使不主動休眠,也很有可能因為輪片時間到達而把執行機會讓給其他線程。

2.創建協同程序

創建協同程序很簡單,咋一看,其實和線程沒差別~
代碼如下:

復制代碼 代碼如下:

local co = coroutine.create(function() print("hello coroutine"); end);

 

協同的程序的操作都在coroutine里,create函數的參數就是協同程序要執行的函數,就這么運行代碼是沒有效果的。

因為協同程序創建后,默認是掛起狀態。

協同程序的四種狀態分別為:掛起(suspended)、運行(running)、死亡(dead)、正常(normal)。
 
要想協同程序運行起來,就要調用resume函數。
如下代碼:

復制代碼 代碼如下:

    local co = coroutine.create(function() print("hello coroutine"); end);
    coroutine.resume(co);

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] hello coroutine

 

3.更像樣的協同程序

剛剛那個協同程序太簡陋的,沒有任何作用,直接打印一條語句之后就結束了,同時它的狀態也變成了死亡狀態。

我們來一個帥一點的協同程序:

復制代碼 代碼如下:

    local co = coroutine.create(function()
        for i = 1, 2, 1 do
            print("木頭挺聰明的+" .. i);
        end
    end);
    coroutine.resume(co);

 

運行結果如下:

復制代碼 代碼如下:

[LUA-print] 木頭挺聰明的+1
[LUA-print] 木頭挺聰明的+2

所以我就說,電腦就是誠實,這日志打印的,真好看(小若:我們不要理這個神經病了)

 

4.讓協同程序掛起——yield

既然協同程序和線程差不多,那肯定不能讓協同程序一次過執行完畢了,這就沒有意義了。
我們來看看怎么讓協同程序掛起,如下代碼:

復制代碼 代碼如下:

    local co = coroutine.create(function()
        for i = 1, 2, 1 do
            print("木頭挺聰明的+" .. i);
            coroutine.yield();
        end
    end);
    coroutine.resume(co);
    print(coroutine.status(co));

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] 木頭挺聰明的+1
[LUA-print] suspended

這回就只輸出了一條日志就停止了,后面我們還調用了status函數,打印協同程序當前的狀態,suspended即為掛起狀態。

 

因為這個協同程序還沒有執行完畢,所以只能是掛起狀態。
 
那么,如果讓這協同程序繼續執行呢?很簡單,再次調用resume函數,如代碼:

 

復制代碼 代碼如下:

local co = coroutine.create(function()
        for i = 1, 2, 1 do
            print("木頭挺聰明的+" .. i);
            coroutine.yield();
        end
    end);
    coroutine.resume(co);
    print(coroutine.status(co));
  
    coroutine.resume(co);
    print(coroutine.status(co));
  
    coroutine.resume(co);
    print(coroutine.status(co));

 

這次有點復雜了,先看看輸出結果:

復制代碼 代碼如下:

[LUA-print] 木頭挺聰明的+1
[LUA-print] suspended
[LUA-print] 木頭挺聰明的+2
[LUA-print] suspended
[LUA-print] dead

我一共執行了三次resume函數,但很顯然,這個協同程序的for循環只會執行2次。

 

那為什么第二次resume執行之后,協同程序的狀態還是掛起呢?不應該是結束了么?結束了就應該是死亡狀態了。

而第三次執行resume之后,反而沒有任何輸出,此時的狀態才真正切換到死亡狀態。
 
這是為什么呢?(小若:趕緊說,不說我看電影去了)
再來這么看看就明白了,加幾條打印代碼:

復制代碼 代碼如下:

local co = coroutine.create(function()
        for i = 1, 2, 1 do
            print("木頭挺聰明的+" .. i);
            coroutine.yield();
            print("一次循環結束");
        end
        print("協同程序結束");
    end);
    coroutine.resume(co);
    print(coroutine.status(co));
  
    coroutine.resume(co);
    print(coroutine.status(co));
  
    coroutine.resume(co);
    print(coroutine.status(co));

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] 木頭挺聰明的+1
[LUA-print] suspended
[LUA-print] 一次循環結束
[LUA-print] 木頭挺聰明的+2
[LUA-print] suspended
[LUA-print] 一次循環結束
[LUA-print] 協同程序結束
[LUA-print] dead

這就很明顯了,在協同程序里調用yield函數時,會被掛起,而yield函數的返回要等下一次調用resume函數時才能得到。

 

所以,yield函數下面的print語句在下一次的resume調用時才被執行。

又所以,當for循環第二次執行時,協同程序被掛起,需要等待再一次resume時,for循環才能真正執行完畢。

這就是這段代碼的特殊之處了。

5.resume操作的返回值

其實resume函數是有返回值的。
我們試試運行下面的代碼:

復制代碼 代碼如下:

    local co = coroutine.create(function()
        for i = 1, 2, 1 do
            coroutine.yield();
        end
    end);
    local result, msg = coroutine.resume(co);
    print(result);
    print(msg);

輸出結果如下:
復制代碼 代碼如下:

[LUA-print] true
[LUA-print] nil

resume返回兩個值,第一個值代表協同程序是否正常執行,第二個返回值自然是代表錯誤信息。
我們試試讓協同程序出現錯誤:
復制代碼 代碼如下:

    local co = coroutine.create(function()
        error("呵呵,報錯了吧");
    end);
    local result, msg = coroutine.resume(co);
    print(result);
    print(msg);

 

輸出結果如下:

復制代碼 代碼如下:

[LUA-print] false
[LUA-print] [string "src/main.lua"]:91: 呵呵,報錯了吧

 

6.結束

好了,雖然我已經寫了這么多了,但是我真正想記錄的東西還沒開始寫呢~!
我了個噗,今晚我還能不能好好玩了…
好吧,內容有點多,下一篇繼續…

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频不卡中文| 欧美国产在线电影| 国产精品久久99久久| 黑人极品videos精品欧美裸| 亚洲一区免费网站| 国产一区二区三区在线观看视频| 国外视频精品毛片| 亚洲精品一区久久久久久| 亚洲自拍偷拍福利| 91精品国产色综合久久不卡98口| 久久亚洲精品国产亚洲老地址| 亚洲wwwav| 欧美黑人一级爽快片淫片高清| 成人精品一区二区三区电影黑人| 北条麻妃在线一区二区| 欧美色视频日本高清在线观看| 欧美激情极品视频| 久久久久久亚洲精品不卡| 国产成人精品久久二区二区| 亚州欧美日韩中文视频| 中文字幕精品网| 亚洲人成在线观看网站高清| 久久亚洲精品小早川怜子66| 欧美日韩国产成人在线| 欧美裸体男粗大视频在线观看| 91福利视频在线观看| 在线观看视频亚洲| 美女啪啪无遮挡免费久久网站| 亚洲精品一区二区网址| 国产精品久久久久91| 国模精品一区二区三区色天香| 久久九九精品99国产精品| 精品久久香蕉国产线看观看gif| 日韩第一页在线| 国产精品麻豆va在线播放| 性欧美xxxx视频在线观看| 免费91麻豆精品国产自产在线观看| 少妇av一区二区三区| 精品久久香蕉国产线看观看gif| 欧美激情女人20p| 青草青草久热精品视频在线网站| 欧美电影免费观看电视剧大全| 中文字幕亚洲第一| 日本高清不卡在线| 久久精品国亚洲| 久久久久北条麻妃免费看| 国产成人精品日本亚洲| 欧美日韩性视频| 欧美老女人在线视频| 日韩中文第一页| 91久久久久久久一区二区| 91免费电影网站| 91福利视频网| 国产91露脸中文字幕在线| 91麻豆桃色免费看| 91色在线视频| 91夜夜揉人人捏人人添红杏| 欧美福利视频在线| 国产精品扒开腿做爽爽爽视频| 久久91精品国产| 欧美人与性动交| 亚洲天堂av在线播放| 精品国产31久久久久久| 成人精品视频在线| 亚洲欧美日韩网| 久久综合久中文字幕青草| 欧美极度另类性三渗透| 欧美成人免费在线观看| 亚洲国产精品悠悠久久琪琪| 97免费视频在线| 亚洲一区精品电影| 国产精品爽爽ⅴa在线观看| 欧美风情在线观看| 亚洲香蕉伊综合在人在线视看| 久久亚洲春色中文字幕| 欧美成人中文字幕在线| 91精品视频免费| 欲色天天网综合久久| 亚洲另类图片色| 国内成人精品视频| 欧美午夜激情视频| 亚洲国产成人久久| 正在播放亚洲1区| 欧美大片va欧美在线播放| 欧美激情精品久久久久久| 久久男人av资源网站| 69视频在线播放| 欧美性色19p| 久久五月情影视| 91免费观看网站| 国产精品视频久久久久| 亚洲最大的成人网| 亚洲激情第一页| 国产视频综合在线| 欧美日韩成人在线观看| 91精品视频在线看| 97视频在线观看视频免费视频| 欧美一级bbbbb性bbbb喷潮片| 国产日本欧美在线观看| 久久综合电影一区| 欧美性xxxx极品hd满灌| 国产在线精品播放| 日日噜噜噜夜夜爽亚洲精品| 国产精品极品尤物在线观看| 久久99久久99精品中文字幕| 国产精品久久久久77777| 国产在线精品一区免费香蕉| 怡红院精品视频| 中文字幕日韩精品有码视频| 国产一区二区在线免费视频| 日韩欧美中文免费| 欧美日韩国产精品| 97**国产露脸精品国产| 精品国产一区二区三区久久| 亚洲电影免费在线观看| 欧美国产精品人人做人人爱| 精品一区二区三区四区| 久久久精品国产| 国产精品久在线观看| 粉嫩老牛aⅴ一区二区三区| 日韩av色在线| 日韩免费观看视频| 欧美日韩亚洲高清| 日韩中文字幕在线看| 国产精品久久久久999| 成人午夜黄色影院| 欧洲成人免费视频| 国产精品国产三级国产aⅴ浪潮| 国产91精品久| 91欧美激情另类亚洲| 国产精品视频免费在线观看| 日韩精品在线视频观看| 欧美极品少妇xxxxⅹ免费视频| 日韩在线中文字| 国产香蕉精品视频一区二区三区| 成人黄色在线免费| 欧美性少妇18aaaa视频| 日韩欧美在线视频免费观看| 精品久久久久久久久久| 91久久久久久| 国产精品网站视频| 国产视频观看一区| 欧美日韩精品在线| 国产亚洲激情在线| 国产亚洲欧洲高清| 国产精品777| 91在线无精精品一区二区| 国产成人高清激情视频在线观看| 精品久久久久久亚洲精品| 91色琪琪电影亚洲精品久久| 91精品在线观看视频| 国产精品日韩av| 91大神福利视频在线| 国产精品久久久久久亚洲调教| 久久久女女女女999久久| 亚洲欧美日韩精品久久奇米色影视| 久久中文精品视频| 日韩一区二区在线视频| 国产精品久久久久久久久久免费| 国产在线观看不卡| 日韩69视频在线观看| 国产v综合v亚洲欧美久久| 有码中文亚洲精品| 日韩美女视频在线观看|