$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:大家都是怎么在代码中用子协程去节省时间呢?写法是什么样的呢?