关于 swoole 的协程和 channel 使用遇到的问题

2021-01-06 12:28:35 +08:00
 yuandj
$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:大家都是怎么在代码中用子协程去节省时间呢?写法是什么样的呢?

1965 次点击
所在节点    PHP
3 条回复
mxtob
2021-01-06 13:05:39 +08:00
wg
chan
for 10
go
i <-chan pop
push i
wg done


for data i
chan push i
wg add

wg done
chan close

这样行吗
mxtob
2021-01-06 13:08:39 +08:00
倒数第二句是 wg wait
yuandj
2021-01-06 13:33:00 +08:00
@mxtob 把读写颠倒一下,是个不错的想法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX