2016-12-06 68 views
3

我想實現我的工作人員的並行執行,並且我使用ReactPHP來幫助我。 https://github.com/reactphp/reactReactPHP阻塞在一個循環內

但我沒有得到我期望得到的行爲。

場景:

我有三名工人。

fetch.php parse.php notify.php

fetch.phpnotify.php不具備prerequired運行條件,使他們能夠並行運行,應該首先運行。

parse.php需要等待fetch.php完成工作,然後它應該執行。

所以我有我的父母腳本process.php所有的魔法發生。

$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'  
    ]; 
} 

因此,而不是得到這個輸出:

FETCH 
NOTIFY 
PARSE 

我越來越

FETCH 
PARSE 
NOTIFY 

而腳本等待分析完成,然後進入下一個任務是通知。

所以我做錯了什麼,因爲我第一次玩ReactPHP可能是一些菜鳥的錯誤。

是我使用遞歸,並阻止循環或別的東西的問題。

也許循環沒有實現來解決這種問題,我試圖解決?

回答

1

我明白了。

問題與遞歸有關。

看到我的第一個任務獲取我剛echo 'FETCH';

於是立即獲取數據,並進入。對(「數據」)的事件,並呼籲用新的陣列重新運作它的瞬間。所以這是我的設計問題。

我發佈這個問題後立即想出來。

如果我編輯我的fetch.php工人並在echo之前設置sleep(1)我得到通知工作者首先輸出字符串。