Ich versuche, eine parallele Ausführung meiner Arbeiter zu erreichen, und ich verwende ReactPHP
, um mir zu helfen. https://github.com/reactphp/reactReactPHP blockiert in einer Schleife
Aber ich bekomme kein Verhalten, das ich erwarte.
Szenario:
Ich habe drei Arbeiter.
fetch.php
parse.php
notify.php
fetch.php
und notify.php
sind keine Bedingungen prerequired zu laufen, so dass sie zunächst parallel und laufen soll laufen.
parse.php
muss warten, bis fetch.php
mit der Arbeit fertig ist und dann sollte es ausgeführt werden.
So habe ich mein Eltern Skript process.php
, wo all die Magie passiert.
$tasks = ['fetch', 'notify'];
forkProcess($tasks);
function forkProcess($tasks)
{
if (empty($tasks)) return false;
$loop = React\EventLoop\Factory::create();
foreach ($tasks as $task) {
$process = new React\ChildProcess\Process("php $task.php");
$loop->addTimer(0.001, function($timer) use ($process, $task) {
$process->start($timer->getLoop());
$process->stdout->on('data', function($output) use ($task) {
echo $output;
$subTasks = getDependentTask($task);
forkProcess($subTasks);
});
});
}
$loop->run();
}
function getDependentTask($task)
{
if ($task != 'fetch') return [];
return [
'parse'
];
}
Anstatt also diese Ausgabe des Erhaltens:
FETCH
NOTIFY
PARSE
Ich erhalte
FETCH
PARSE
NOTIFY
Und Skript wartet auf das Parsen auf die nächste Aufgabe zu beenden und geht dann die benachrichtigen ist.
Also mache ich etwas falsch und da ich zum ersten Mal mit ReactPHP herumspiele, ist es wahrscheinlich ein Anfängerfehler.
Ist das Problem, dass ich Rekursion verwende und das die Schleife oder etwas anderes blockiert.
Vielleicht Schleife wurde nicht implementiert, um diese Art von Problemen zu lösen, die ich versuche zu lösen?