1

看了韩天峰PHP 协程:Go + Chan + Defer的文章,觉得swoole大大降低了协程的开发门槛,同时提供了php yield原生协程不具备的功能,尝试着写一些简单的例子。

前言:协程是什么?

协程是协作式任务(用户来决定控制流),相对的是抢占式任务(例如cpu来调度资源)。
简单点说,协程的精髓就是控制流的让出与恢复。

环境:

ubuntu18.04.1 LTS
php7.3.0
swoole4.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先结束,恢复执行t1
t2/t3的恢复执行类似t1
然后整个程序结束

特别说明
t1/t2/t3的恢复执行并非严格按照挂起顺序恢复(本地测试中恢复执行顺序是t1/t3/t2)
恢复执行没有确定的顺序
适用于无序、独立的任务并行执行

总结

这个例子,主要来描述控制流的让出和恢复执行,这也是协程的精髓。
当然,程序的实现依赖于swoole的封装,感谢swoole!

其他
如果同时安装了xdebug扩展,在运行协程代码时,会直接提示"Warning: go(): Using Xdebug in coroutines is extremely dangerous, please notice that it may lead to coredump!",这种提示方式有点过于强硬,可以在xdebug分析时给出提示,有逼迫用户二选一的嫌疑。


davidyanxw
132 声望6 粉丝

« 上一篇
nohup, &作用