xgo + Channel

最后更新于:2022-04-02 07:05:09

## xgo + Channel 协程基本用法: [>> 到 GitHub 查看 DEMO <<](https://github.com/mix-php/mix-skeleton/tree/v2.1/app/Console/Commands/CoroutineCommand.php) ### 讲解 - 首先使用 xgo 方法,以闭包的形式开启一个协程。 - 接下来在 for 循环中,使用 xgo 以 callable 的方式启动子协程,并传递一个 Channel 参数。 - 代码在 `xgo([$this, 'foo'], $chan);` 那里并不会阻塞,而是继续往下执行 - 执行到 `$chan->pop()` 时,由于 sql 查询还未执行,于是当前协程阻塞,释放执行流到 `foo` 方法中执行sql - 当 sql 执行完时, `$chan->pop()` 被唤醒并返回数据,继续往下执行。 - 直到循环执行完毕,`println` 打印总执行时间。 - 输出 `Time: 5s ` 说明两次 SQL 查询是并行执行的。 ## `xgo` 方法 >[danger] 该方法内部有框架异常处理逻辑封装,不可使用 swoole 原生的 go 方法替代 ``` // 与 swoole 原生 go 方法一样,支持闭包 xgo(function () { }); // 还扩展了支持直接调用方法,并附带参数 xgo([$this, 'foo'], $chan); ``` ## `Swoole\Coroutine\Channel` 全部方法: - `push`:放入对象 - `pop`:抛出对象 - `isEmpty`:是否为空 - `isFull`:是否已满 - `stats`:返回状态信息 - `length`:返回长度 - `close`:关闭通道
';