協程
程序組件種類之一
協程與子常式一樣,協程(coroutine)也是一種程序組件。相對子常式而言,協程更為一般和靈活,但在實踐中使用沒有子常式那樣廣泛。協程源自Simula和Modula-2語言,但也有其他語言支持。
協程更適合於用來實現彼此熟悉的程序組件,如合作式多任務,迭代器,無限列表和管道。協程最初在1963年被提出。
協程不是進程或線程,其執行過程更類似於子常式,或者說不帶返回值的函數調用。
一個程序可以包含多個協程,可以對比與一個進程包含多個線程,因而下面我們來比較協程和線程。我們知道多個線程相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。
coroutine.create()
函數參數:接收單個參數,該參數是coroutine的主函數,即resume會執行的函數
函數返回值:返回其控制器,一個對象為thread的對象
函數作用:creat函數創建一個新的coroutine,定義了協程內的任務流程。從面對對象的角度來看,可以看成是coroutine類創建了一個對象co
coroutine.resume(co,[val1,val2,...])
函數參數:第一個參數即creat的返回值,一個thread對象。第二個參數是coroutine中執行需要的參數,是一個變長參數,可以傳入任意多個。
函數返回值:當程序運行沒有錯誤的時候,返回true,同時返回前一個調用coroutine.yield中傳入的參數。如果有錯誤,返回錯誤false以及錯誤信息。
函數作用:當第一次調用coroutine的resume方法的時候,其從主函數第一行開始執行,之後再coroutine開始運行后,它會一直運行到自身終止或者是coroutine的下一個yield函數。
coroutine.yield(...)
函數參數:傳入變長參數。
函數返回值:返回在前一個resume中傳入的參數值。
函數作用:掛起當前的執行協程。該協程不能是一個C函數,一個元表或一個迭代器。
coroutine.running():返回當前正在執行的協程。
coroutine.status():返回當前協程的狀態,有running/suspended/normal/dead等。