Lua學習筆記之協程(coroutine)

目錄

1、博客介紹

2、內容

(1)什麼是協程 (摘自菜鳥教程)

(2)與線程的區別 (摘自菜鳥教程)

(3)方法 (摘自菜鳥教程)

(4)具體用法

3、推送

4、結語


1、博客介紹

本篇作爲Lua學習筆記之一,記錄有關Lua協程的相關知識點,本篇內容將會很淺顯,僅僅是對不瞭解協程知識的一個入門級學習,想要深入的同學可以跳過。


2、內容

(1)什麼是協程 (摘自菜鳥教程)

擁有獨立的堆棧,獨立的局部變量,獨立的指令指針,同時又與其它協同程序共享全局變量和其它大部分東西。

(2)與線程的區別 (摘自菜鳥教程)

一個具有多個線程的程序可以同時運行幾個線程,而協同程序卻需要彼此協作的運行。在任一指定時刻只有一個協同程序在運行,並且這個正在運行的協同程序只有在明確的被要求掛起的時候纔會被掛起。協同程序有點類似同步的多線程,在等待同一個線程鎖的幾個線程有點類似協同。

(3)方法 (摘自菜鳥教程)

方法 描述
coroutine.create() 創建 coroutine,返回 coroutine, 參數是一個函數,當和 resume 配合使用的時候就喚醒函數調用
coroutine.resume() 重啓 coroutine,和 create 配合使用
coroutine.yield() 掛起 coroutine,將 coroutine 設置爲掛起狀態,這個和 resume 配合使用能有很多有用的效果
coroutine.status() 查看 coroutine 的狀態
注:coroutine 的狀態有三種:dead,suspended,running,具體什麼時候有這樣的狀態請參考下面的程序
coroutine.wrap() 創建 coroutine,返回一個函數,一旦你調用這個函數,就進入 coroutine,和 create 功能重複
coroutine.running() 返回正在跑的 coroutine,一個 coroutine 就是一個線程,當使用running的時候,就是返回一個 corouting 的線程號

(4)具體用法

我們可以通過create來創建一個協程,create的參數是一個函數,create返回的是一個thread,我們可以通過resume來調用這個thread來執行我們通過create創建的協程,如下述代碼所示:

--創建
local co = coroutine.create(function()
	print("我被調用了")
end)

--啓動
coroutine.resume(co)   

-----------------------------------輸出
我被調用了

當一個協程運行後,我們是沒有辦法從外部將其停止的,只有在協程內部通過yield可以將協程掛起,或者稱之爲暫停,如下代碼所示:

--創建
local co = coroutine.create(function()
	for i=1,10 do
		print("輸出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--啓動
coroutine.resume(co)   

-----------------------------------輸出
輸出:1
輸出:2
輸出:3
輸出:4
輸出:5

與此同時,當一個協程被掛起後,我們可以繼續通過resume再次調用thread來繼續執行協程後續的內容,代碼如下述所示:

--創建
local co = coroutine.create(function()
	for i=1,10 do
		print("輸出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--啓動
coroutine.resume(co)   

----------被掛起後繼續執行

--恢復
coroutine.resume(co)   

-----------------------------------輸出
輸出:1
輸出:2
輸出:3
輸出:4
輸出:5
輸出:6
輸出:7
輸出:8
輸出:9
輸出:10

上述基本就是協程所有的內容了,下面我們說一下wrap方法,wrap方法和create相似,同樣是創建一個協程,和create不同的是wrap返回的不是一個thread而是一個函數本身,通過wrap創建的協程,我們不再通過resume來調用和恢復,而是直接通過調用返回的函數本身來實現掛起和恢復,代碼如下所示:

--創建
local co = coroutine.wrap(function()
	for i=1,10 do
		print("輸出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--調用  ---------將在輸出五次後被掛起
co()

print("----------------------:被掛起")

--恢復
co()

-- -----------------------------------輸出
輸出:1
輸出:2
輸出:3
輸出:4
輸出:5
----------------------:被掛起
輸出:6
輸出:7
輸出:8
輸出:9

3、推送

Github:https://github.com/KingSun5


4、結語

若是覺得博主的文章寫的不錯,不妨關注一下博主,點贊一下博文,另博主能力有限,若文中有出現什麼錯誤的地方,歡迎各位評論指摘。

       QQ交流羣:806091680(Chinar)

       該羣爲CSDN博主Chinar所創,推薦一下!我也在羣裏!

       本文屬於原創文章,轉載請著名作者出處並置頂!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章