如何将一个数组分2批来运行coroutine处理
Swoole版本:4.2.1
我想将一个数组分2批来运行coroutine处理,请问怎么实现呢?
以下是我现在的代码逻辑,以下例子跑到一定数量的时候就会出问题,我企图通过分批运行来解决,而在实际的项目里,真正发生的问题是内存溢出了。
实际项目中,我是在 Laravel 的命令行下跑任务的,然后下面例子中的 $list 有 3800+ 个元素,遍历每一个产生一个协程,每个协和走 HTTP 往公司的一个服务取数据后push到接收协程那里进行计算,但迭代到第 3700 个元素执行 go 函数产生协程时就报内存溢出了。
$list = array_fill(0, 100000, 'test');
$listCount = count($list);
Coroutine::set(['max_coroutine' => $listCount + 1]);
$channel = new Channel(floor($listCount / 4));
go(function ()use($channel, $listCount){
$popCount = 0;
while($popCount < $listCount){
$value = $channel->pop();
$popCount++;
//...
}
});
foreach($list as $i => $item){
go(function()use($channel, $i, $item){
echo "第 {$i} 个协程在跑了\n";
try{
// $data = 通过协程的Client请求些数据回来($item);
$cli = new \Swoole\Coroutine\Http\Client('www.qq.com', 80);
$cli->setHeaders([
'Host' => "www.qq.com",
"User-Agent" => 'Chrome/49.0.2587.3',
'Accept' => 'text/html,application/xhtml+xml,application/xml',
'Accept-Encoding' => 'gzip',
]);
$cli->set([ 'timeout' => 1]);
$cli->get('/');
$data = $cli->body;
$cli->close();
$channel->push([
'success' => true,
'data' => $data,
]);
}catch(\Exception $e){
$channel->push([
'success' => false,
'data' => $data,
]);
}
});
}
swoole_event::wait();
echo 'over';
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
将 PHP 的
memory_limit
调大。这么多并发确实需要更大的内存。你需要协程调度器。https://wiki.swoole.com/wiki/...