跳到主要内容

协程并发查询

案例

业务:按月分表,并发查询一年的数据,相当于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个月的数据!
-----------------------