协程并发查询
案例
业务:按月分表,并发查询一年的数据,相当于12张表。
Course/channel.php
<?php
include '../vendor/autoload.php';
use Swoole\Coroutine as co;
go(function () {
$chan = new co\Channel(12);
$wait = new \EasySwoole\Component\WaitGroup(12);
// 模拟并发查询数据库,将数据push到channel
for ($i = 1; $i <= 12; $i++) {
$wait->add();
go(function () use ($wait, $chan, $i) {
co::sleep(rand(1, 3));
$chan->push("第{$i}个月的数据!");
$wait->done();
});
}
$wait->wait();
// 将channel中的数据都拿出来输出到文件
while (1) {
if ($chan->isEmpty()) {
break;
}
$res = $chan->pop();
error_log($res . PHP_EOL, 3, 'channel.log');
}
error_log('-----------------------' . PHP_EOL, 3, 'channel.log');
});
产生的文件:channel.log
channel.log
第5个月的数据!
第8个月的数据!
第6个月的数据!
第1个月的数据!
第9个月的数据!
第10个月的数据!
第2个月的数据!
第11个月的数据!
第4个月的数据!
第7个月的数据!
第12个月的数据!
第3个月的数据!
-----------------------