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';
小86 89
10月27日提问
2 个回答
0

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

撰写答案

推广链接