Параллельная многопоточность php - PullRequest
0 голосов
/ 18 марта 2020

Я недавно работал с многопоточностью в php, используя pthreads, используя следующий код:

$pool = new \Pool(count($chunks), Autoloader::class, [APP_PATH . '/loader.php']);

foreach($chunks as $key => $chunk) {            
    $pool->submit(new MyTask($key, $chunk));
}

while ($pool->collect());

$pool->shutdown();

Это работало хорошо, но мне нужно обновить мой код, заменив его параллельным, заменив Pthreads. Я попробовал следующее, но оно зависает в первой Задаче, а другие никогда не выполняются.

$cli = APP_PATH . '/loader.php';
foreach($chunks as $key => $chunk) { 
    $parallel->run(function() use ($cli, $key, $chunk) {
        if(!defined('ROOT')) { require $cli; }
        $my_task = new MyTask($key, $chunk);
        $my_task->run();
    });
}

Кто-нибудь знает, как решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 24 марта 2020

Решите эту ситуацию с помощью реакции php:

$loop = Factory::create();

$finite = Finite::create($loop, 100);

$promises = [];
foreach($chunks as $key => $chunk) { 
    $promises[] = $finite->run(function() use ($key, $chunk) {
        $my_task = new MyTask($key, $chunk);
        $my_task->run();
    });
}

$signalHandler = function () use ($finite, $loop) {
    $loop->stop();
    $finite->close();
};
all($promises)->then(function ($v) use ($finite, $loop, $signalHandler, $timer) {
    $finite->close();
    $loop->removeSignal(SIGINT, $signalHandler);
})->done();

$loop->addSignal(SIGINT, $signalHandler);

echo 'Loop::run()', PHP_EOL;
$loop->run();
echo 'Loop::done()', PHP_EOL;
...