[学习篇] Swoole 协程

什么是进程?

进程就是应用程序的启动实例。独立的文件资源,数据资源,内存空间。

什么是线程?

线程属于进程,是程序的执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程有两种调度策略,一是:分时调度,二是:抢占式调度。

什么是协程?

协程是轻量级线程, 协程也是属于线程,协程是在线程里执行的。协程的调度是用户手动切换的,所以又叫用户空间线程。协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。协程的调度策略是:协作式调度。

Swoole协程的原理

  1. Swoole4由于是单线程多进程的,同一时间同一个进程只会有一个协程在运行。

  2. Swoole server 接收数据在worker进程触发onReceive回调,产生一个携程。Swoole为每个请求创建对应携程。协程中也能创建子协程。

  3. 协程在底层实现上是单线程的,因此同一时间只有一个协程在工作,协程的执行是串行的。

  4. 因此多任务多协程执行时,一个协程正在运行时,其他协程会停止工作。当前协程执行阻塞IO操作时会挂起,底层调度器会进入事件循环。当有IO完成事件时,底层调度器恢复事件对应的协程的执行。。所以协程不存在IO耗时,非常适合高并发IO场景。(如下图)

Swoole的协程执行流程

  • 协程没有IO等待 正常执行PHP代码,不会产生执行流程切换

  • 协程遇到IO等待 立即将控制权切,待IO完成后,重新将执行流切回原来协程切出的点

  • 协程并行协程依次执行,同上一个逻辑

  • 协程嵌套执行流程由外向内逐层进入,直到发生IO,然后切到外层协程,父协程不会等待子协程结束

GO语言协程

  • Go语言原生层面就支持协层,不需要声明协程环境。(swoole非协程环境不能使用协程)

  • Go 协程是基于多线程的,可以利用多核 CPU,同一时间可能会有多个协程在执行

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

支持下,swoole的相关 文章确实少,希望php 的路能走的更远

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!