博客 / 詳情

返回

我們一起來學lua:協程(coroutine) 二

大家好,騷氣十足的額,又來了,對,今天我們主要來學習下lua協程的用法,小夥伴們準備好小板凳,準備開車了~~~(ps:好像有點偏題了,不過不重要你們當作沒看見就行(O ^ ~ ^ O))

協程主要函數:
函數名 入參 返回值 描述
coroutine.create() 接受單個參數,這個參數是coroutine的主函數 返回它的控制器,(一個對象為thread)的對象 創建 coroutine,返回 coroutine, 參數是一個函數,當和 resume 配合使用的時候就喚醒函數調用
coroutine.resume() 第一個參數:coroutine.create的返回值,即一個thread對象。第二個參數:coroutine中執行需要的參數,是一個變長參數,可傳任意多個參數。 如果程序沒有任何運行錯誤的話,那麼會返回true,之後的返回值是前一個調用coroutine.yleld中傳入的參數。如果有任何錯誤的話,就會返回false,加上錯誤信息 重啓 coroutine(重啓時不用再傳參數),和 create 配合使用
coroutine.yield() 傳入變長參數,這些參數會作為返回值被 coroutine.resume接收 返回在前一個調用coroutine.resume()中傳入的參數值 掛起 coroutine,將 coroutine 設置為掛起狀態,這個和 resume 配合使用能有很多有用的效果(返回參數)
coroutine.running() 返回當前正在運行的協程。如果它被主線程調用的話,會返回nil 返回正在跑的 coroutine,一個 coroutine 就是一個線程,當使用running的時候,就是返回一個 corouting 的線程號如果沒有返回nil
coroutine.status() 返回當前協程的狀態:有running,suspended,normal,dead 返回正在跑的 coroutine,一個 coroutine 就是一個線程,當使用running的時候,就是返回一個 corouting 的線程號如果沒有返回nil

創建協程實例:

--創建一個協程

co = coroutine.create(

 function (str)

 print(str);

 end

)

print("當前協程狀態:"..coroutine.status(co))

運行結果:

當前協程狀態:suspended

創建協程的函數是coroutine.create,調用這個函數成功之後就會返回一個協程對象,後續我們有關協程的操作就圍繞這個對象進行。上面的例子co就是我們協程對象。通過coroutine.status這個函數查看協程狀態,我們可以發現當前的狀態是suspended掛起狀態,也就是説coroutine.create只完成創建協程的動作,但是協程現在並沒有跑起來,不然這時候的狀態就應該是running了。
為了讓協程跑起來,這時候就輪到coroutine.resume這個函數大展拳腳了。我們再來看下下面這hello world例子。(ps:人人都愛hello world 不要嫌棄博主舉的例子很low啊≧◠◡◠≦✌)

hello world例子:

--創建一個協程,但還沒有調用

co = coroutine.create(

 function (str)

 print(str);

 end

)

--開啓協程,打印hello world!

coroutine.resume(co,"hello world!")

通過hello world這個例子我們就可以清楚的看到協程正常運行起來了,這時候協程的狀態是runnning嘛?有興趣的童鞋可以打印出來看看,想想看為什麼是這個狀態。有時候我覺得,學習編程,最重要的還是大家能夠多動手,多思考。不然就算我博客寫得再詳細,大家能夠掌握的東西還是很有限的。just do it~~~話不多説,幹就是了!

lua中文手冊
參考文章一
參考文章二

user avatar wanmuc 頭像 proheart 頭像 jijige_6231ef0f1d144 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.