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