複製鏈接
請複製以下鏈接發送給好友

協程

鎖定
協程與子例程一樣,協程(coroutine)也是一種程序組件。相對子例程而言,協程更為一般和靈活,但在實踐中使用沒有子例程那樣廣泛。協程源自 Simula 和 Modula-2 語言,但也有其他語言支持。
中文名
協程
外文名
coroutine
所屬學科
計算機科學
類    型
程序組件
相似程序
子例程

目錄

協程簡介

協程更適合於用來實現彼此熟悉的程序組件,如合作式多任務,迭代器,無限列表和管道。 協程最初在1963年被提出。

協程定義

協程不是進程或線程,其執行過程更類似於子例程,或者説不帶返回值函數調用
一個程序可以包含多個協程,可以對比與一個進程包含多個線程,因而下面我們來比較協程和線程。我們知道多個線程相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。
編程語言Lua從5.0版開始支持協程的概念,極大的擴展了Lua的能力。Lua的協程通過擴展庫coroutine來實現,其中的所有函數如下(具體可以參考Lua的官方manual)
coroutine.create
coroutine.resume
coroutine.running
coroutine.status
coroutine.wrap
coroutine.yield
當前運行的代碼可以看作運行在主協程中(就像C程序的main運行在主線程中),通過create可以創建一個協程,resume以運行此協程,直到新協程調用yield程序才能返回到”主協程“中運行。
coroutine.create()
函數參數:接收單個參數,該參數是coroutine的主函數,即resume會執行的函數
函數返回值:返回其控制器,一個對象為thread的對象
函數作用:create函數創建一個新的coroutine,定義了協程內的任務流程。從面對對象的角度來看,可以看成是coroutine類創建了一個對象co
coroutine.resume(co,[val1,val2,...])
函數參數:第一個參數即create的返回值,一個thread對象。第二個參數是coroutine中執行需要的參數,是一個變長參數,可以傳入任意多個。
函數返回值:當程序運行沒有錯誤的時候,返回true,同時返回前一個調用coroutine.yield中傳入的參數。如果有錯誤,返回錯誤false以及錯誤信息
函數作用:當第一次調用coroutine的resume方法的時候,其從主函數第一行開始執行,之後再coroutine開始運行後,它會一直運行到自身終止或者是coroutine的下一個yield函數。
coroutine.yield(...)
函數參數:傳入變長參數
函數返回值:返回在前一個resume中傳入的參數值
函數作用:掛起當前的執行協程。該協程不能是一個C函數,一個元表或一個迭代器
coroutine.running():返回當前正在執行的協程
coroutine.status():返回當前協程的狀態,有running/suspended/normal/dead等。