如何将一个数组分2批来运行coroutine处理

发布于 2022-09-11 23:12:16 字数 1752 浏览 22 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

佼人 2022-09-18 23:12:17

将 PHP 的memory_limit调大。这么多并发确实需要更大的内存。

拥醉 2022-09-18 23:12:17

你需要协程调度器。https://wiki.swoole.com/wiki/...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文