协程Coroutine

协程是一种用户态的轻量级线程android

server的发展以下:
IO密集型应用: 多进程->多线程->事件驱动->协程
CPU密集型应用:多进程-->多线程nginx

若是说多进程对于多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提升性能的单核CPU的潜力。编程

异步事件驱动模型中,把会致使阻塞的操做转化为一个异步操做,主线程负责发起这个异步操做,并处理这个异步操做的结果。因为全部阻塞的操做都转化为异步操做,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,因此这种模型的性能一般会比较好。总的说来,当单核cpu性能提高,cpu不在成为性能瓶颈时,采用异步server可以简化编程模型,也能提升IO密集型应用的性能。windows

 

协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。所以:多线程

协程能保留上一次调用时的状态(即全部局部状态的一个特定组合),每次过程重入时,就至关于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。架构

在并发编程中,协程与线程相似,每一个协程表示一个执行单元,有本身的本地数据,与其它协程共享全局数据和其它资源。目前主流语言基本上都选择了多线程做为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是协做式多任务并发

不论是进程仍是线程,每次阻塞、切换都须要陷入系统调用(system call),先让CPU跑操做系统的调度程序,而后再由调度程序决定该跑哪个进程(线程)。
并且因为抢占式调度执行顺序没法肯定的特色,使用线程时须要很是当心地处理同步问题,而协程彻底不存在这个问题(事件驱动和异步程序也有一样的优势)。框架

咱们在本身在进程里面完成逻辑流调度,碰着i\o我就用非阻塞式的。那么咱们便可以利用到异步优点,又能够避免反复系统调用,还有进程切换形成的开销,分分钟给你上几千个逻辑流不费力。这就是协程。异步

协程 vs 事件驱动

以nginx为表明的事件驱动的异步server正在横扫天下,那么事件驱动模型会是server端模型的终点吗?
事件驱动编程的架构是预先设计一个事件循环,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数。其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动做,或者是一个时间事件。这个触发函数,能够是系统默认的也能够是用户注册的回调函数。函数

事件驱动程序设计着重于弹性以及异步化上面。许多GUI框架(如windows的MFC,Android的GUI框架),Zookeeper的Watcher等都使用了事件驱动机制。

基于事件驱动的编程是单线程思惟,其特色是异步+回调。
协程也是单线程,可是它能让原来要使用异步+回调方式写的非人类代码,能够用看似同步的方式写出来。它是实现推拉互动的所谓非抢占式协做的关键。

总结

协程的好处:

  • 跨平台
  • 跨体系架构
  • 无需线程上下文切换的开销
  • 无需原子操做锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。因此很适合用于高并发处理。

缺点:

    • 没法利用多核资源:协程的本质是个单线程,它不能同时将单个CPU 的多个核用上,协程须要和进程配合才能运行在多CPU上.固然咱们平常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
    • 进行阻塞(Blocking)操做(如IO时)会阻塞掉整个程序:这一点和事件驱动同样,可使用异步IO操做来解决

 

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000

http://www.infoq.com/cn/articles/CplusStyleCorourtine-At-Wechat

https://www.zhihu.com/question/32218874