前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swoole中的协程使用相关说明,快来围观

Swoole中的协程使用相关说明,快来围观

原创
作者头像
CRMEB商城源码
发布2022-04-26 10:03:23
3940
发布2022-04-26 10:03:23
举报
文章被收录于专栏:crmeb

什么是协程

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

协程特点

  1. 开发者可以无感知的用同步的代码编写方式达到异步 IO 的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。
  2. 同时由于底层封装了协程,所以对比传统的 PHP 层协程框架,开发者不需要使用 yield 关键词来标识一个协程 IO 操作,所以不再需要对 yield 的语义进行深入理解以及对每一级的调用都修改为 yield,这极大的提高了开发效率。
  3. 协程适合 IO 密集型应用,因为协程在 IO 阻塞 时会自动调度,减少 IO 阻塞导致的时间损失。
  4. 睡眠 1 万次,读取,写入,检查和删除文件 1 万次,使用 PDO 和 MySQLi 与数据库通信 1 万次,创建 TCP 服务器和多个客户端相互通信 1 万次,创建 UDP 服务器和多个客户端到相互通信 1 万次...... 一切都在一个进程一秒内完美完成!

适用场景

​ 高并发服务,如秒杀系统、高性能API接口、RPC服务器,连接池,IM聊天、游戏服务器、物联网、消息服务器等。

示例1:

用户可以通过go函数创建一个协程,以达到并发执行的效果,如下面代码所示:

代码语言:javascript
复制
go(function () {
    echo "one" . PHP_EOL;
});

go(function () {
    echo "two" . PHP_EOL;
});

go(function () {
    echo "three" . PHP_EOL;
});
  • 每当出现一个go,底层会自动创建一个协程,协程输出内容后,然后自动退出
示例2:

通过协程可以并发执行客户端请求,使用到协程调度带来的 IO 阻塞时的调度,来实现高性能服务,下面是通过 defer 机制实现请求的并发执行:

代码语言:javascript
复制
go(function () {
    // 协程 MySQL 客户端
    $mysql = new Swoole\Coroutine\MySQL();
    $mysql->connect([
        'host' => '172.17.0.1',
        'user' => 'root',
        'password' => 'root',
        'database' => 'swoole',
    ]);
    $mysql->setDefer();
    $mysql->query('select sleep(2);');
    
     print_r("time1: " . time() . PHP_EOL);
    
    // 协程 Redis 客户端
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect('172.17.0.1', 6379);
    $redis->setDefer();
    $redis->set('name', '张三');
    $redis->recv();
    
    print_r("time2: " . time() . PHP_EOL);

    $redis->setDefer();
    $redis->get('name');

    $res1 = $mysql->recv();
    $res2 = $redis->recv();

    print_r(['result1: ' => $res1[0]['sleep'], 'result2: ' => $res2, 'time3: ' => time()]);
});
  • 以上述代码为例,可以简单理解为 defer 模式下, 多个客户端的请求响应是并发的,设置 setDefer(true) 后,通过 Redis 或 MySQL 客户端发起请求,将不再等待服务器返回结果,而是在发送请求之后,立即返回 true。在此之后可以继续发起其他 Redis、MySQL 请求,最后再使用 recv() 方法接收响应内容。

注意事项

  1. 如果在多个协程间共用同一个协程客户端,同步阻塞程序不同,协程是并发处理请求的,因此同一时间可能会有很多个请求在并行处理,一旦共用客户端连接,就会导致不同协程之间发生数据错乱。
  2. 协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以在协程切换的前后不能保证全局变量以及static变量的一致性。

总结

  1. 技术无止境,协程的使用需要结合实际业务进行具象分析,才能合理的发挥技术特点。
  2. 要定期抽出时间来充实自己,这样才能更好的拓展技术视野的宽度,时代在不断的进步,尤其是IT类的行业发展最为迅速,如果不去学习的话就很容易落后的。

最后

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是协程
  • 协程特点
  • 适用场景
    • 示例1:
      • 示例2:
      • 注意事项
      • 总结
      • 最后
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档