coroutine
協同程式與線程差不多,也就是一條執行序列,擁有自己獨立的棧,局部變量和指令指針,同時又與其它協同程式共享全局變量和其它大部分東西。線程與協同程式的主要差別在于,一個具有多線程的程式可以同時運作幾個線程,而協同程式卻需要彼此協作地運作。就是說,一個具有多個協同程式的程式在任何時刻隻能運作一個協同程式,并且正在運作的協同程式隻會在其顯示地挂起時,它的執行才會暫停。
原理探析
coroutine建立的所謂的“線程”都不是真正的作業系統的線程,實際上是通過儲存stack狀态來模拟的。
由于是假的線程,是以切換線程的開銷極小,同時建立線程也是輕量級的,new_thread隻是在記憶體建立了一個stack用于存放新coroutine的變量,也稱作lua_State
調用yield()目前線程交出控制權,同時還可以通過stack傳回參數。調用resume的線程(可了解為主線程)獲得傳回的參數。
Lua yield()和Java中的Thread.yield()有點相似,但是差別更大。Java中的yield調用後隻是将目前CPU切換到另外一個線程,CPU可能随時會繼續回到線程執行。
我更傾向于把Lua中的yield()和resume()和Java中的wait()和notify()來對比。它們表現的行為基本一緻。
Why coroutine?
上面對coroutine有個基本的了解,是以大家都會象我一樣去想,為什麼要用coroutine?先研究下優點
每個coroutine有自己私有的stack及局部變量。
同一時間隻有一個coroutine在執行,無需對全局變量加鎖。
順序可控,完全由程式控制執行的順序。而通常的多線程一旦啟動,它的運作時序是沒法預測的,是以通常會給測試所有的情況帶來困難。是以能用coroutine解決的場合應當優先使用coroutine。
jiahuafu