从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的程序时,开发者只须要考虑如何利用并发特性使本身程序的并发性能更好,而不须要去考虑锁、冲突、不一致性等问题。线程