什么是协程

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

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

什么是通道

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

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

协程容器

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

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

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

创建协程

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

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

协程调度

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

  • 首先,在执行某个协程代码的过程中发现这行代码遇到了 Co\System::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\run() 不能嵌套使用。

Swoole 协程简介的更多相关文章

  1. [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程

    大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...

  2. Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  3. Swoole 协程与 Go 协程的区别

    Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...

  4. Swoole协程与传统fpm同步模式比较

    如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP.那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用. 首先,Swoole 只能运行在命令行(Cli)模 ...

  5. swoole| swoole 协程初体验 转

    swoole| swoole 协程初体验   date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验description: 通过协程的执行初窥 swo ...

  6. swoole协程通道channel

    swoole 协程通道 为了协程直接互相通讯传递数据 和go的通道很相似 Co\run(function(){ $chan = new Swoole\Coroutine\Channel(1); Swo ...

  7. swoole 协程介绍

    协程的执行顺序: 1 2 3 4 5 6 7 8 9 go(function () {     echo "hello go1 \n"; });   echo "hell ...

  8. Zend 官方框架增加 Swoole 协程支持 !

    前言 Zend Framework 是 PHP 的官方框架,随着 Zend-Expressive-Swoole 0.2.2 的发布,率先支持了 Swoole 4 的协程功能,现在可以仅通过一个配置即可 ...

  9. Swoole 协程的并发调用及使用示例

    示例一: 利用通道pop会自动挂起当前协程,等待生产者推送数据的特性,实现并发调用,并在协程完成后组合结果集. $serv = new Swoole\Http\Server("127.0.0 ...

随机推荐

  1. java代码从出生到执行的过程浅析

    阅读<深入理解java虚拟机 第二版 JVM高级特性与最佳实践> - jdk版本为1.6 1.什么是编译型语言.解释型语言 解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码, ...

  2. LeetCode 36. Valid Sudoku (Medium)

    题目 Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according ...

  3. epoll 使用详解

    epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是e ...

  4. 『忘了再学』Shell基础 — 2、Shell的作用与分类

    目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...

  5. Django中的常用字段类型与参数

    Django中的常用字段类型 1. 数值型 以下都是数值相关的,比如AutoField,它在MySQL中的类型为int(11),而BooleanField在MySQL中对应的类型是tinyint(1) ...

  6. java 数据类型String 【正则表达式】匹配

    1,什么是正则表达式 正则表达式是用来处理字符串的,其实正则表达式是非常复杂的,专门去系统学习需要花很长的时间,我们课程主要就是把常用的基础的给大家讲解. 正则表达式可以用来干什么: (1),匹配字符 ...

  7. JAVA微信公众号网页开发——通过接收人的openid发送模板消息

    TemplateData.java 1 package com.weixin.weixin.template; 2 3 public class TemplateData { 4 private St ...

  8. 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(2) - 在Flash调试及离线启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板在Flash调试与离线启动. 腾讯 TencentOS 团队于 ...

  9. 【LeetCode】LCP 06. 拿硬币

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 替换 日期 题目地址:https://leetcode ...

  10. 【LeetCode】 258. Add Digits 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:减1模9 方法三:直接模9 日 ...