Lua協(xié)程

先看一段代碼

coAA = coroutine.create(
    function ()
        print('at coAA -- 1')
        --這里啟動協(xié)程coBB
        coroutine.resume(coBB)
        print('at coAA -- 2')
    end
)

coBB = coroutine.create(
    function ()
        print('at coBB -- 1')
        print('at coBB -- 2')
        --這里啟動協(xié)程coCC
        coroutine.resume(coCC)
        print('at coBB -- 3')
    end
)

coCC = coroutine.create(
    function ()
        print('at coCC -- 1')
        --這里掛起協(xié)程coCC
        coroutine.yield()
        print('at coCC -- 2')
    end
)

--這里啟動協(xié)程coA
coroutine.resume(coAA)

運行結(jié)果
at coAA -- 1
at coBB -- 1
at coBB -- 2
at coCC -- 1
at coBB -- 3
at coAA -- 2

因為coCC被掛起,所以壶谒,沒有輸出
at coCC -- 2
可以調(diào)用coroutine.resume(coCC)云矫,觸發(fā)掛起的協(xié)程

上面代碼中主要用到coroutine的API
coroutine.create (f) --創(chuàng)建一個協(xié)程
coroutine.resume (co [, val1, ···]) --觸發(fā)一個協(xié)程
coroutine.yield (···) --掛起(阻塞)一個協(xié)程
具體解釋如下

coroutine庫詳解

(1)coroutine.create (f)

傳一個函數(shù)參數(shù),用來創(chuàng)建協(xié)程汗菜。返回一個“thread”對象让禀。

(2)coroutine.isyieldable ()

如果正在運行的協(xié)程可以讓出,則返回真陨界。值得注意的是巡揍,只有主協(xié)程(線程)和C函數(shù)中是無法讓出的。

(3)coroutine.resume (co [, val1, ···])

這是一個非常重要的函數(shù)菌瘪。用來啟動或再次啟動一個協(xié)程腮敌,使其由掛起狀態(tài)變成運行狀態(tài)。
可以這么說麻车,resume函數(shù)相當(dāng)于在執(zhí)行協(xié)程中的方法缀皱。參數(shù)Val1...是執(zhí)行協(xié)程co時傳遞給協(xié)程的方法。
首次執(zhí)行協(xié)程co時动猬,參數(shù)Val1...會傳遞給協(xié)程co的函數(shù);
再次執(zhí)行協(xié)程co時表箭,參數(shù)Val1...會作為給協(xié)程co中上一次yeild的返回值赁咙。
不知道這句話大家理解了沒,這是協(xié)程的核心。如果沒理解也不用急彼水,繼續(xù)往下看崔拥,稍后我會詳細解釋。
resume函數(shù)返回什么呢凤覆?有3種情況:
1)链瓦、如果協(xié)程co的函數(shù)執(zhí)行完畢,協(xié)程正常終止盯桦,resume 返回 true和函數(shù)的返回值慈俯。
2)、如果協(xié)程co的函數(shù)執(zhí)行過程中拥峦,協(xié)程讓出了(調(diào)用了yeild()方法)贴膘,那么resume返回true和協(xié)程中調(diào)用yeild傳入的參數(shù)。
3)略号、如果協(xié)程co的函數(shù)執(zhí)行過程中發(fā)生錯誤刑峡,resume返回false與錯誤消息。
可以看到resume無論如何都不會導(dǎo)致程序崩潰玄柠。它是在保護模式下執(zhí)行的突梦。

(4)coroutine.running ()

用來判斷當(dāng)前執(zhí)行的協(xié)程是不是主線程,如果是羽利,就返回true阳似。

(5)coroutine.status (co)

返回一個字符串,表示協(xié)程的狀態(tài)铐伴。有4種狀態(tài):
1)撮奏、running。如果在協(xié)程的函數(shù)中調(diào)用status当宴,傳入?yún)f(xié)程自身的句柄畜吊,那么執(zhí)行到這里的時候才會返回running狀態(tài)。
2)户矢、suspended玲献。如果協(xié)程還未結(jié)束,即自身調(diào)用了yeild或還沒開始運行梯浪,那么就是suspended狀態(tài)捌年。
3)、normal挂洛。如果協(xié)程Aresume協(xié)程B時礼预,協(xié)程A處于的狀態(tài)為normal。在協(xié)程B的執(zhí)行過程中虏劲,協(xié)程A就一直處于normal狀態(tài)托酸。因為它這時候既不是掛起狀態(tài)褒颈、也不是運行狀態(tài)。
4)励堡、dead谷丸。如果一個協(xié)程發(fā)生錯誤結(jié)束,或正常終止应结。那么就處于dead狀態(tài)刨疼。如果這時候?qū)λ{(diào)用resume,將返回false和錯誤消息鹅龄。

(6)coroutine.wrap (f)

wrap()也是用來創(chuàng)建協(xié)程的揩慕。只不過這個協(xié)程的句柄是隱藏的。跟create()的區(qū)別在于:
1)砾层、wrap()返回的是一個函數(shù)漩绵,每次調(diào)用這個函數(shù)相當(dāng)于調(diào)用coroutine.resume()。
2)肛炮、調(diào)用這個函數(shù)相當(dāng)于在執(zhí)行resume()函數(shù)止吐。
3)、調(diào)用這個函數(shù)時傳入的參數(shù)侨糟,就相當(dāng)于在調(diào)用resume時傳入的除協(xié)程的句柄外的其他參數(shù)碍扔。
4)、調(diào)用這個函數(shù)時秕重,跟resume不同的是不同,它并不是在保護模式下執(zhí)行的,若執(zhí)行崩潰會直接向外拋出溶耘。

(7)coroutine.yield (···)

使正在執(zhí)行的函數(shù)掛起二拐。
傳遞給yeild的參數(shù)會作為resume的額外返回值。
同時凳兵,如果對該協(xié)程不是第一次執(zhí)行resume百新,resume函數(shù)傳入的參數(shù)將會作為yield的返回值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庐扫,一起剝皮案震驚了整個濱河市饭望,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形庭,老刑警劉巖铅辞,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萨醒,居然都是意外死亡斟珊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門验靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倍宾,“玉大人雏节,你說我怎么就攤上這事胜嗓「咧埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵辞州,是天一觀的道長怔锌。 經(jīng)常有香客問我,道長变过,這世上最難降的妖魔是什么埃元? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮媚狰,結(jié)果婚禮上岛杀,老公的妹妹穿的比我還像新娘。我一直安慰自己崭孤,他們只是感情好类嗤,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辨宠,像睡著了一般遗锣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗤形,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天精偿,我揣著相機與錄音,去河邊找鬼赋兵。 笑死笔咽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霹期。 我是一名探鬼主播叶组,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼经伙!你這毒婦竟也來了扶叉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帕膜,失蹤者是張志新(化名)和其女友劉穎枣氧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垮刹,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡达吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒典。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪劫。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吞鸭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出覆糟,到底是詐尸還是另有隱情刻剥,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布滩字,位于F島的核電站造虏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麦箍。R本人自食惡果不足惜漓藕,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挟裂。 院中可真熱鬧享钞,春花似錦、人聲如沸诀蓉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽交排。三九已至划滋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埃篓,已是汗流浹背处坪。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留架专,地道東北人同窘。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像部脚,于是被迫代替她去往敵國和親想邦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 我們首先介紹一下什么是協(xié)程委刘、然后詳細介紹一下coroutine庫丧没,然后介紹一下協(xié)程的簡單用法,最后介紹一下協(xié)程的復(fù)...
    17269780ceda閱讀 712評論 0 6
  • “協(xié)程(coroutine)”于我而言還是比較新的概念锡移,Lua 也是剛接觸不久呕童。不過碰巧這段時間我又在看 ES6 ...
    NARUTO_86閱讀 1,705評論 0 3
  • 并發(fā)是現(xiàn)實世界的本質(zhì)特征,而聰明的計算機科學(xué)家用來模擬并發(fā)的技術(shù)手段便是多任務(wù)機制淆珊。多任務(wù)機制大致可劃分為兩種: ...
    JunChow520閱讀 2,887評論 0 4
  • 一夺饲、 coroutine.resume()函數(shù) 用來首次啟動或再次啟動一個協(xié)程,使其由掛起狀態(tài)變成運行狀態(tài)。也可以...
    北山學(xué)者閱讀 1,009評論 0 1
  • Lua中協(xié)同程序:意義和Unity中一樣Lua中協(xié)同程序的函數(shù)被放在coroutine的表中協(xié)同程序狀態(tài):掛起往声、執(zhí)...
    周末的游戲之旅閱讀 108評論 0 0