共计 792 个字符,预计需要花费 2 分钟才能阅读完成。
看了韩天峰 PHP 协程:Go + Chan + Defer 的文章,觉得 swoole 大大降低了协程的开发门槛,同时提供了 php yield 原生协程不具备的功能,尝试着写一些简单的例子。
前言:协程是什么?
协程是协作式任务(用户来决定控制流),相对的是抢占式任务(例如 cpu 来调度资源)。简单点说,协程的精髓就是控制流的让出与恢复。
环境:
ubuntu18.04.1 LTSphp7.3.0swoole4.2.10
看例子:simple_co.php
<?php
// simple co
function t1() {
Co::sleep(0.05);
echo __METHOD__.PHP_EOL;
}
function t2() {
Co::sleep(0.05);
echo __METHOD__.PHP_EOL;
}
function t3() {
Co::sleep(0.05);
echo __METHOD__.PHP_EOL;
}
go(“t1”);
go(“t2”);
go(“t3”);
$ time php simple_co.php # 执行时间在 0.07s 左右
分析
这个简单的例子,定义了三个任务 (t1/t2/t3),通过短名称 go 来运行三个任务。运行过程如下:t1 执行,遇到 Co::sleep,主动让出控制流,t1 暂停(等待 Co::sleep 结束后恢复执行)t2 执行,类似 t1 情况,暂停 t3 执行,类似 t1 情况,暂停没有其他程序了,3 个协程的执行都处于暂停状态 …0.05s 后 … 协程上 t1 的 sleep 先结束,恢复执行 t1t2/t3 的恢复执行类似 t1 然后整个程序结束
特别说明 t1/t2/t3 的恢复执行并非严格按照挂起顺序恢复(本地测试中恢复执行顺序是 t1/t3/t2)恢复执行没有确定的顺序适用于无序、独立的任务并行执行
结束
这个例子,主要来描述控制流的让出和恢复执行,这也是协程的精髓。当然,程序的实现依赖于 swoole 的封装,感谢 swoole!