咱們一塊兒來學lua:協程(coroutine) 三

*上一期咱們主要介紹了協程的相關函數,以及協程的建立。這一期,咱們主要來介紹協程怎麼進行協做的,而協做也正是協程的精華所在,小夥伴們,小板凳帶好了嘛?≧◠◡◠≦✌*
生活當中咱們作事情常常都是不可能一干到底的。好比,你正在看書,這時候忽然來了個電話,或者說你在跟朋友家人視頻聊天,這時候忽然沒信號了了。在這種狀況下,咱們都不得不停下原先手中的事情,去處理其餘事情,等其餘事情處理完了,再接着原先的事情往下走。爲了處理這樣的問題,協程也提供了協做機制。咱們先來看看下面的一個簡單實例。
協做實例一:
--建立一個協程,但尚未調用

read_co = coroutine.create(

 function ()

 print("看書")

 print("有電話打進來")

 coroutine.yield()

 print("電話打完了,繼續看書")

 end

)

--開啓讀書協程

coroutine.resume(read_co)

print("打電話")

coroutine.resume(read_co)
運行結果:
看書
有電話打進來
打電話
電話打完了,繼續看書

實例經過coroutine.yield()掛起協程,而後又經過coroutine.resume切換回協程,繼續往下執行。是否是很簡單?接下來咱們來看下coroutine.yield跟coroutine.resume更深一步的作法,咱們仍是直接看實例吧。異步

協程實例二:
--建立一個協程,但尚未調用

read_co = coroutine.create(

 function ()

 print("看書")

 print("有電話打進來")

 local ret1, ret2 = coroutine.yield("我讀到第三章了", "第二章很精彩")

 print("ret1 = "..ret1)

 print("ret2 = "..ret2)

 print("電話打完了,繼續看書")

 end

)

--開啓讀書協程

local ret1, ret2, ret3 = coroutine.resume(read_co)

print(ret1)

print("ret2 = "..ret2)

print("ret3 = "..ret3)

print("打電話")

coroutine.resume(read_co,"王老師打來的電話","讓我讀第五章")

運行結果:函數

看書
有電話打進來
true
ret2 = 我讀到第三章了
ret3 = 第二章很精彩
打電話
ret1 = 王老師打來的電話
ret2 = 讓我讀第五章
電話打完了,繼續看書

從這個實例咱們能夠看到coroutine.yield的參數能夠返回給前一個coroutine.resume。這裏須要注意的是coroutine.resume的第一個返回值是協程運行是否出錯,經過打印咱們能夠知道這裏要麼等於true要麼等於false。從第二個返回值開始纔是coroutine.yield傳出來的值。協程使用coroutine.yield掛起以後,如何使它繼續執行呢?仍是要經過coroutine.resume,這時候coroutine.yield的返回值也就是coroutine.resume的入參信息。這裏童鞋們看明白了嘛?
好了,今天協程內容就介紹到這裏,明天咱們繼續深刻探討協程的協做問題,以及協做在異步通訊的具體應用~~~code

相關文章
相關標籤/搜索