折腾 swoole 协程有一段时间了, 总结一篇入门贴, 希望对新手有帮助.
内容概览:协程的执行顺序: 初窥 swoole 中协程的调度
协程为什么快: 减少IO阻塞带来的性能损耗
swoole 协程和 go 协程对比: 单进程 vs 多线程
协程的执行顺序
先来看看基础的例子:go(function () { echo "hello go1 \n";
});echo "hello main \n";
go(function () { echo "hello go2 \n";
});
go() 是 \Co::create() 的缩写, 用来创建一个协程, 接受 callback 作为参数, callback 中的代码, 会在这个新建的协程中执行.
备注: \Swoole\Coroutine 可以简写为 \Co
上面的代码执行结果:root@b98940b00a9b /v/w/c/p/swoole# php co.phphello go1
hello main
hello go2
执行结果和我们平时写代码的顺序, 好像没啥区别. 实际执行过程:运行此段代码, 系统启动一个新进程
遇到 go(), 当前进程中生成一个协程, 协程中输出 heelo go1, 协程退出
进程继续向下执行代码, 输出 hello main
再生成一个协程, 协程中输出 heelo go2, 协程退出
运行此段代码, 系统启动一个新进程. 如果不理解这句话, 你可以使用如下代码:// co.php<?phpsleep (100);
执行并使用 ps aux 查看系统中的进程:root@b98940b00a9b /v/w/c/p/swoole# php co.php &
root@b98940b00a9b /v/w/c/p/swoole# ps auxPID USER TIME COMMAND 1 root 0:00 php -a 10 root 0:00 sh 19 root 0:01 fish 749 root 0:00 php co.php 760 root 0:00 ps aux
我们来稍微改一改, 体验协程的调度:use Co;
go(function () {
Co::sleep(1); // 只新增了一行代码
echo "hello go1 \n";
});echo "hello main \n";
go(function () { echo "hello go2 \n";
});
\Co::sleep() 函数功能和 sleep() 差不多, 但是它模拟的是 IO等待(IO后面会细讲). 执行的结果如下:root@b98940b00a9b /v