2016-12-06 1 views
3

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?

Antwort

1

Ich habe es.

Problem ist mit Rekursion.

in meiner ersten Aufgabe Siehe holen ich es ist nur ein echo 'FETCH';

habe und sofort, so dass es Daten erhält sofort und geht in der .on (‚Daten‘) Ereignis und Anrufe funktionieren wieder mit neuen Array. Das ist also ein Designproblem, das ich habe.

Ich habe es sofort herausgefunden, nachdem ich diese Frage gepostet habe.

Wenn ich meine fetch.php Worker bearbeiten und sleep(1) vor echo setzen, erhalte ich notify worker, um zuerst die Ausgabe auszugeben.