关于 swoole 的协程和 channel 使用遇到的问题
資深大佬 : yuandj 2
$qpsChannel = new Channel(); go(function () use ($qpsChannel, $configs) { $waitGroup = new WaitGroup(); foreach ($configs as $key => $config) { $waitGroup->add(); go(function () use ($qpsChannel, $waitGroup, $key, $config) { if ($this->skipConfigByStatus($config) === false && $this->skipConfigByQps($config) === false) { $qpsChannel->push('111111'); } else { $qpsChannel->push('222222'); } $waitGroup->done(); }); } $waitGroup->wait(); $qpsChannel->close(); }); while (true) { $qpsStatusArr = $qpsChannel->pop(); var_dump($qpsStatusArr); if ($qpsStatusArr === false) break; }
上面代码逻辑是打开一个子协程去循环判断一些逻辑,并把结果写入到 channel 中,处理完之后,从子协程把 channle 关闭(关闭之后再操作 channel 就会返回 false)
正常的逻辑应该是打开子协程去处理逻辑,然后进入到 while 去读取 channle,当子协程有 channel push 时,while 中的逻辑会把结果打印出来
现在遇到的问题是只打印出一个 false,就结束了。难道是子协程处理时间太快了,还没走到 while,channle 就被 close 了?
问题 1:求大神解答上面代码问题。
问题 2:大家都是怎么在代码中用子协程去节省时间呢?写法是什么样的呢?
大佬有話說 (3)