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