博客 / 詳情

返回

我們一起來學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的入參信息。這裏童鞋們看明白了嘛?
好了,今天協程內容就介紹到這裏,明天我們繼續深入探討協程的協作問題,以及協作在異步通信的具體應用~~~

user avatar feixianghelanren 頭像 heyiming 頭像 manerfan 頭像 xuesi_595299e4a2381 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.