swoole 协程介绍

从 4.0 版本开始 Swoole 提供了完整的协程(Coroutine)+ 通道(Channel)特性,带来全新的 CSP 编程模型

扩展:CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。

作用:
  • 开发者可以无感知的用同步的代码编写方式达到异步 IO 的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护
  • 同时由于底层封装了协程,所以对比传统的 PHP 层协程框架,开发者不需要使用 yield 关键词来标识一个协程 IO 操作,所以不再需要对yield 的语义进行深入理解以及对每一级的调用都修改为 yield,这极大的提高了开发效率
  • 提供了各种类型完善的协程客户端,可以满足大部分开发者的需求。
什么是协程

协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低,和线程不同的是协程没法利用多核 cpu 的,想利用多核 cpu 需要依赖 Swoole 的多进程模型

扩展:进程和线程的区别

什么是 channel

channel 可以理解为消息队列,只不过是协程间的消息队列,多个协程通过 push 和 pop 操作生产消息和消费消息,用来协程之间的通讯。需要注意的是 channel 是没法跨进程的,只能一个 Swoole 进程里的协程间通讯,最典型的应用是连接池和并发调用。

什么是协程调度
  • 首先每个协程可以简单的理解为一个线程,大家知道多线程是为了提高程序的并发,同样的多协程也是为了提高并发。
  • 用户的每个请求都会创建一个协程,请求结束后协程结束,如果同时有成千上万的并发请求,某一时刻某个进程内部会存在成千上万的协程,那么 CPU资源是有限的,到底执行哪个协程的代码?
  • 决定到底让 CPU 执行哪个协程的代码决断过程就是协程调度,Swoole 的调度策略又是怎么样的呢?
协程调度过程
  1. 在执行某个协程代码的过程中发现这行代码遇到了 Co::sleep() 或者产生了网络 IO,例如 MySQL->query(),这肯定是一个耗时的过程,Swoole 就会把这个 Mysql 连接的 Fd 放到 EventLoop 中。

  2. 让出这个协程的 CPU 给其他协程使用:即 yield(挂起)

  3. 等待 MySQL 数据返回后就继续执行这个协程:即 resume(恢复)

  4. 如果协程的代码有 CPU 密集型代码,我们可以开启 enable_preemptive_scheduler,Swoole
    会强行让这个协程让出 CPU。

你可能感兴趣的:(swoole 协程介绍)