協程與子例程一樣,協程(coroutine)也是一種程式組件。相對子例程而言,協程更為一般和靈活,但在實踐中使用沒有子例程那樣廣泛。協程源自 Simula 和 Modula-2 語言,但也有其他語言支持。
基本介紹
- 中文名:協程
- 外文名:coroutine
- 類型:程式組件
- 相似程式:子例程
簡介,定義,
簡介
協程更適合於用來實現彼此熟悉的程式組件,如合作式多任務,疊代器,無限列表和管道。 協程最初在1963年被提出。
定義
協程不是進程或執行緒,其執行過程更類似於子例程,或者說不帶返回值的函式調用。
一個程式可以包含多個協程,可以對比與一個進程包含多個執行緒,因而下面我們來比較協程和執行緒。我們知道多個執行緒相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。
程式語言Lua從5.0版開始支持協程的概念,極大的擴展了Lua的能力。Lua的協程通過擴展庫coroutine來實現,其中的所有函式如下(具體可以參考Lua的官方manual)
coroutine.createcoroutine.resumecoroutine.runningcoroutine.statuscoroutine.wrapcoroutine.yield
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等。