*上一期我們主要介紹了協程的相關函數,以及協程的創建。這一期,我們主要來介紹協程怎麼進行協作的,而協作也正是協程的精華所在,小夥伴們,小板凳帶好了嘛?≧◠◡◠≦✌*
生活當中我們做事情經常都是不可能一干到底的。比如,你正在看書,這時候突然來了個電話,或者説你在跟朋友家人視頻聊天,這時候突然沒信號了了。在這種情況下,我們都不得不停下原先手中的事情,去處理其他事情,等其他事情處理完了,再接着原先的事情往下走。為了處理這樣的問題,協程也提供了協作機制。我們先來看看下面的一個簡單實例。
協作實例一:
--創建一個協程,但還沒有調用
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的入參信息。這裏童鞋們看明白了嘛?
好了,今天協程內容就介紹到這裏,明天我們繼續深入探討協程的協作問題,以及協作在異步通信的具體應用~~~