Я запускаю некоторый процесс pcntl для вычисления некоторых данных и хочу дождаться завершения всех дочерних процессов и отправить все возвращаемые данные в главный процесс.
Как я могу это сделать?
моя черта pnctl такая:
<?php namespace App\Console\Commands;
trait PcntlTrait
{
private $workers = 1;
public function worker($count)
{
$this->worker = $count;
}
public function pcntl_call($all, \Closure $callback)
{
$count = count($all);
$perNum = ceil($count / $this->workers);
for($i = 0; $i < $this->workers; $i++){
$pids[$i] = pcntl_fork();
switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit;
case 0:
$start = $i * $perNum;
return $callback(array_slice($all, $start, $perNum));
exit;
default:
break;
}
}
$ret = [];
foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $info);
$ret = array_merge($ret, $info);
}
}
return $ret;
}
}
и мой TestCase Вот так:
<?php
use App\Console\Commands\PcntlTrait;
class PcntlImp
{
use PcntlTrait;
}
class TestPcntlTrait extends \TestCase
{
public function setup()
{
$this->createApplication();
}
public function testPcntlCall()
{
$arr = [1,2,3,4,5,6,7,8,9,10];
$imp = new \PcntlImp();
$imp->worker(1);
$data = $imp->pcntl_call($arr, function($info){
if (empty($info)){
return [];
}
$ret = [];
foreach ($info as $item) {
$ret[] = $item * $item;
}
return $ret;
});
$this->assertCount(10, $data);
}
}
Но я могу получить ошибку:
array_merge(): Argument #2 is not an array
и я знаю, что второй аргумент функции pcntl_wait — статус, а не возвращаемые данные. Но я не знаю, как это сделать?
Задача ещё не решена.
Других решений пока нет …