Swoole 中的协程使用相关说明,快来围观
什么是协程
协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低,和线程不同的是协程没法利用多核 cpu 的,想利用多核 cpu 需要依赖 Swoole
的多进程模型。
协程特点
开发者可以无感知的用同步的代码编写方式达到异步 IO 的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。
同时由于底层封装了协程,所以对比传统的
PHP
层协程框架,开发者不需要使用yield
关键词来标识一个协程IO
操作,所以不再需要对yield
的语义进行深入理解以及对每一级的调用都修改为yield
,这极大的提高了开发效率。协程适合
IO
密集型应用,因为协程在IO
阻塞 时会自动调度,减少IO
阻塞导致的时间损失。睡眠 1 万次,读取,写入,检查和删除文件 1 万次,使用 PDO 和 MySQLi 与数据库通信 1 万次,创建 TCP 服务器和多个客户端相互通信 1 万次,创建 UDP 服务器和多个客户端到相互通信 1 万次...... 一切都在一个进程一秒内完美完成!
适用场景
高并发服务,如秒杀系统、高性能 API 接口、RPC 服务器,连接池,IM 聊天、游戏服务器、物联网、消息服务器等。
示例 1:
用户可以通过 go 函数创建一个协程,以达到并发执行的效果,如下面代码所示:
每当出现一个 go,底层会自动创建一个协程,协程输出内容后,然后自动退出
示例 2:
通过协程可以并发执行客户端请求,使用到协程调度带来的 IO
阻塞时的调度,来实现高性能服务,下面是通过 defer
机制实现请求的并发执行:
以上述代码为例,可以简单理解为 defer 模式下, 多个客户端的请求响应是并发的,设置
setDefer(true)
后,通过 Redis 或 MySQL 客户端发起请求,将不再等待服务器返回结果,而是在发送请求之后,立即返回true
。在此之后可以继续发起其他 Redis、MySQL 请求,最后再使用recv()
方法接收响应内容。
注意事项
如果在多个协程间共用同一个协程客户端,同步阻塞程序不同,协程是并发处理请求的,因此同一时间可能会有很多个请求在并行处理,一旦共用客户端连接,就会导致不同协程之间发生数据错乱。
协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以在协程切换的前后不能保证全局变量以及
static
变量的一致性。
总结
技术无止境,协程的使用需要结合实际业务进行具象分析,才能合理的发挥技术特点。
要定期抽出时间来充实自己,这样才能更好的拓展技术视野的宽度,时代在不断的进步,尤其是 IT 类的行业发展最为迅速,如果不去学习的话就很容易落后的。
最后
如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点 star:http://github.crmeb.net/u/defu不胜感激 !
免费获取源码地址:http://www.crmeb.com
PHP 学习手册:https://doc.crmeb.com
技术交流论坛:https://q.crmeb.com
评论