协程优缺点

协程模型

现有的协程调度模型大多是N:M,意思就是每个线程下可以运行多个协程,而且线程也可以有多个。为了调度,又可以有有栈协程和无栈协程。在Linux下通常是利用ucontext_t实现,Boost也有一个context库可以作为实现基础(据说Boost的实现更快,本人未证实)。虽然一个线程下可以运行多个协程,但是同一线程下不能有协程并发。

协程出现的原因

协程主要是为了提高并发,而且主要是IO并发。协程并不适合并行计算或者并行处理任务,因为同一时刻运行的协程数不可能大于操作系统线程,而且需要协程切换,不如线程池。对于IO密集任务,利用回调函数,配合协程,可以使逻辑更加简单清晰,不过协程可以做的,线程一样可以做,比如Reactor模型。

举一个网络通信的例子:

加入10个客户端接入,服务器线程数4。

如果用协程,那么可以直接开启10个协程,接受所有链接,把任务放到协程处理,不过运行时,还是要等到协程依次执行完毕,可以有四个协程同时执行,或者协程内部调度等等,好处是可以直接就接受全部链接;如果用线程,那么一次最多接受4个链接,但是四个链接可以同时处理(假设不使用select,poll或epoll)。

协程优势

  1. 可以一次接受多个连接,一直accept等待链接,有链接到来就开启一个协程完成任务
  2. 编写异步程序逻辑更清晰

注意

协程并不是一定就好,协程能完成的线程一样能完成,协程有它特定的使用场景以及优势。

Logo

更多推荐