Lua 學習筆記(七) —— 協同程序(一)

協同程序:擁有自己獨立的棧、局部變量和指令指針,又與其他協同程序共享全局變量和其他大部分東西。與線程有些類似,區別是:一個具有多個協同程序的程序在任意時刻只能運行一個協同程序。


1.協同程序的狀態:掛起、運行、死亡、正常

檢查協同程序的狀態:coroutine.status()


2.流程:

2.1 創建新的協同程序:
coroutine.create():僅有一個參數,就是要創建的協同程序函數。通常這是一個匿名函數。
例如:
co = coroutine.create(function() print("hello") end)
print(co) -->thread: 003CB2B8
print(coroutine.status(co)) -->suspended


2.2 啓動或再次啓動一個協同程序執行:

coroutine.resume():狀態由掛起改爲運行,當程序執行完畢時,狀態轉爲死亡
coroutine.resume(co) -->hello
print(coroutine.status(co)) -->dead

2.3 掛起協同程序,之後可以恢復它的運行
coroutine.yield():狀態由運行到掛起
co = coroutine.create(function()
	for i = 0, 3 do
		print("co",i)
-- 當遇到coroutine.resume()執行程序時才掛起,下次coroutine.resume()從此處恢復運行
	coroutine.yield()
	end
     end)

coroutine.resume(co) -->co	0
print(coroutine.status(co))
coroutine.resume(co) -->co	1
coroutine.resume(co) -->co	2
coroutine.resume(co) -->co	3

3.正常狀態:當一個協同程序A喚醒協同程序B時,A就處於一種特殊的狀態,既非掛起,也非運行,這種狀態是“正常狀態”。

4.resume-yield 交換數據
co = coroutine.create(function(a,b) print("co",a,b) end)
coroutine.resume(co,1,2) -->co	1	2

所以傳遞給resume的額外參數都將視爲協同程序主函數的參數


co = coroutine.create(function() print("co",coroutine.yield()) end)
coroutine.resume(co) -->第一次運行由於掛起在了print函數中,因此,print函數未執行,所以沒有打印“co”
coroutine.resume(co,4,5) -->co 4 5
yield返回的額外值就是對應resume傳入的參數。
發佈了49 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章