• Swoole 协程简介


    什么是协程

    协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建、销毁和切换的成本都非常低。

    协程不能利用多核 cpu,想利用多核 cpu 需要依赖 Swoole 的多进程模型。

    什么是通道

    通道(channel )是协程间的消息队列,多个协程通过 push 操作生产消息、通过 pop 操作消费消息,通道用来作为协程之间的通讯。

    通道不能跨进程,只能在一个 Swoole 进程里的协程间通讯,典型的应用是连接池并发调用

    协程容器

    协程容器是协程创建和运行的空间,在协程容器中创建的协程里面才能使用协程 API

    Swoole 程序启动的时候大部分情况会自动创建 协程容器,用 Swoole 启动程序的方式一共有三种:

    • 调用异步风格服务端程序的 start 方法,此种启动方式会在事件回调中创建协程容器
    • 调用 Swoole 提供的 2 个进程管理模块 ProcessProcessPoolstart 方法,此种启动方式会在进程启动的时候创建协程容器
    • 其他直接裸写协程的方式启动程序,需要先使用 Co un() 函数创建一个协程容器。

    创建协程

    在创建了协程容器之后,我们就可以在容器中创建协程并调用协程API了。

    创建协程的方法是: SwooleCoroutine::create() ,别名 go() ,创建后的协程会立即执行。

    协程调度

    用户的每个请求都会创建一个协程,请求结束后协程结束,如果同时有成千上万的并发请求,某一时刻某个进程内部会存在成千上万的协程。决定让 CPU 执行哪个协程的代码决断过程就是协程调度

    • 首先,在执行某个协程代码的过程中发现这行代码遇到了 CoSystem::sleep 或者产生了网络 IO,例如 MySQL->query()Swoole 会把这个 Mysql 连接的 Fd 放到 EventLoop 中。
      • 然后让出这个协程的 CPU 给其他协程使用:即 yield(挂起)
      • 等待 MySQL 数据返回后就继续执行这个协程:即 resume(恢复)
    • 其次,如果协程的代码有 CPU 密集型代码,可以开启 enable_preemptive_scheduler,Swoole 会强行让这个协程让出 CPU。

    协程注意事项

    • 协程切换的前后不能保证全局变量以及 static 变量的一致性。
    • 无法通过 $_GET/$_POST/$_REQUEST/$_SESSION/$_COOKIE/$_SERVER$_开头的变量获取到任何属性参数。
    • Co un() 不能嵌套使用。
  • 相关阅读:
    合理的嵌入式开发学习路线
    Nginx
    RARP
    强弱电共地
    ACDC
    各电脑进Bios方法
    Java中Integer.parseInt
    全排列
    Java实现LRU缓存方案?
    缓存有关的几个问题
  • 原文地址:https://www.cnblogs.com/danhuang/p/13267324.html
Copyright © 2020-2023  润新知