$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:大家都是怎么在代码中用子协程去节省时间呢?写法是什么样的呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.