從Erlang進程看協程思想編程
多核慢慢火了之後,協程類編程也開始愈來愈火了。比較有表明性的有Go的goroutine、Erlang的Erlang進程、Scala的actor、windows下的fibre(纖程)等,一些動態語言像Python、Ruby、Lua也慢慢支持協程。windows
其實咱們聽過協程相關不少名詞,下面大體來解釋一下:併發
- OS進程: 進程是資源管理的最小單元,包括進程控制塊(PCB)、程序段、數據段
- OS線程: 線程是程序執行的最小單元,由線程ID,當前指令指針(PC),寄存器集合和堆棧組成;內核線程之間切換的時候須要在內核態進行上下文和堆棧切換。
- 輕量級進程(LWP): 實際上是基於內核線程的高級抽象,每一個LWP對應一個實際的線程。優勢是在某些狀況下不須要新建一個實際進程那麼大開銷。
- 協程: 在不一樣的編程語言或庫裏由於實現方式差別,也叫纖程、actor等。實際能夠理解爲應用程序級別的線程,其調度器不是內核的CPU,而是由用戶級別實現的VM級別調度器。
也就是說,協程具備如下特色:異步
- 協程併發時的切換基本在用戶態級別切換,不會觸發內核,減小系統開銷
- 儘管協程實際確定仍是在某個OS線程上執行,可是如何執行、什麼時候執行、在哪一個線程上執行等都是由用戶的調度器去決定的,即協程使用者無需關心底層線程的狀況。
- 協程做爲用戶級別的存在,實際就是一段待執行的函數,建立銷燬開銷很小;且由於切換基本在用戶態,因此能夠很輕易地在一個進程內開百萬級別的協程。
基本能知足以上特色的咱們均可以稱其爲協程(coroutine)。編程語言
但不一樣語言卻有不一樣實現方式,其中主要有以erlang爲表明的 actor model,還有以Go爲表明的Coroutine。函數
Go那邊不太熟悉,不過主要就是協程間通訊方式和yield主動讓出CPU操做,這些在Python、Ruby等中也有實現。性能
Erlang以及Scala主要採起的是一種 actor model,也叫面向actor的編程。主要遵循如下特色:spa
- 一切皆Actor的思想,即每個執行者都當作一個actor。(有點像Java每個功能承擔者都是一個對象類)
- Actor之間只能容許經過消息傳遞來通訊,不共享內存,且消息傳遞無反作用(無反作用指不會被髒讀或修改等問題困擾)。
- Actor的收發消息是異步的,接收到的消息通常是一份副本。
從他的特性看來,Actor是一種比普通Coroutine更完全的一種面向併發的編程模型。在設計actor model的程序時,開發者只須要考慮如何利用併發特性使本身程序的併發性能更好,而不須要去考慮鎖、衝突、不一致性等問題。線程