业务背景:假设要一次性导出一年的数据,由于数据过大,脚本执行就会变得耗时过长,对于这种场景我们可以 业务数据 按月切割导出,并且月份跟月份之间处理代码耗时互不阻塞 !
Hyperf版本:2.2.0
<?php
namespace App\Command\Audit\Migrate;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Utils\Coroutine;
use Swoole\Coroutine\WaitGroup;
use Psr\Container\ContainerInterface;
use Hyperf\Command\Annotation\Command;
/**
* @Command
*/
#[Command]
class CollaborativePracticeScript extends HyperfCommand
{
/**
* @var ContainerInterface
*/
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
parent::__construct('CollaborativePracticeScript');
}
public function configure()
{
parent::configure();
$this->setDescription('协程');
}
public function handle()
{
// 创建一个月份的数组,存储需要处理的月份数据
$months = ['2021-01', '2021-02', '2021-03']; // 假设有多个月份需要处理
// 创建一个 WaitGroup 实例,用于等待所有协程任务完成
$waitGroup = new WaitGroup();
// 使用协程来同时处理每个月的数据
$results = [];
foreach ($months as $month) {
// 增加 WaitGroup 的计数器
$waitGroup->add();
// 创建一个协程任务
Coroutine::create(function () use ($month, &$results, $waitGroup) {
// 在这里编写处理 $month 数据的业务逻辑代码
// 可以调用自定义的方法或服务
// 例如:handleMonthData($month);
// 这里只是一个示例,延时 1 秒钟模拟处理数据的耗时
Coroutine::sleep(5);
// 处理完成后,保存结果
$results[] = $month . ' 数据处理完成';
// 协程任务完成后,减少 WaitGroup 的计数器
$waitGroup->done();
});
}
// 等待所有协程任务完成
$waitGroup->wait();
// 打印每个任务的结果
foreach ($results as $result) {
echo $result . PHP_EOL;
}
}
}