並列計算、pcntl_forkのラッパークラス()

PHPスクリプトに使用する基本クラスを表示したいと思います。

その利点は、作業を簡単に「並列化」できることです。

すべての「結果」でpcntl_fork()を使用します。



(Linuxでのみテスト済み)



アイデアの本質:





class some_script extends CliScript

{

protected function processWorker ( $item )

{

$this -> log ( "I'm doing heavy job" );

sleep ( rand ( 1 , 5 ));

$this -> log ( "I'm done doing heavy job" );

}



}



$script = new some_script();

$script -> setWorkers ( 5 );

$script -> run ();









その結果、1つの親プロセスと5人の子供に「重い仕事」をさせます。



いくつかの微妙な違いと制限があります。データベースとファイルへのオープン接続が追加される可能性があります。



別のアプローチが必要です。親プロセスはベースを処理する必要があり、子プロセスは「汚れた作業」を実行して結果を返します。 以下に例を示します。



class master_and_workers extends CliScript

{

protected $contracts = array ( 2 , 4 , 5 , 1 , 3 , 7 , 3 , 1 , 4 , 9 , 2 , 4 , 1 );

protected $results ;



protected function processMaster ()

{

foreach ( $this -> contracts as $contract )

{

while ( ! $this -> canStartWorker () ) { sleep ( 1 ); };



$this -> startWorker ( $contract );

}



$this -> waitForChildren ();



var_export ( $this -> results );

}



protected function processWorker ( $item )

{

$this -> log ( "I'm busy for { $item } seconds..." );

sleep ( $item );

$this -> log ( "Job is done." );



return "Job is done. Sleep time was { $item } " ;

}



protected function processResult ( $result )

{

$this -> results [] = $result ;

}



}



$script = new master_and_workers();

$script -> setWorkers ( 3 );

$script -> run ();









混乱している場合の簡単な説明:



開始後、親プロセスでprocessMaster()メソッドが実行され、子プロセスが開始されます。

子プロセスはprocessWorker()メソッドを実行します。

子プロセスが返すことは一時ファイルに保存され、完了後、親のprocessResult()メソッドが呼び出され、結果がそこに渡されます。



CliScriptクラスにはいくつかの便利なメソッドがあります。



getRunningTime()は、開始からの実行時間を秒単位で返します

countWorkers()は、子プロセスの数を返します(親プロセスでのみ意味があります)

log()CliScript :: file file_logファイルが指定されている場合は、ログを記録し、そうでない場合は画面に記録します。 誰が報告するかに関する情報を表示します。



会社全体を「丁寧に」殺すために、SIGTERMシグナルを親プロセスに送信するために、プリミティブハンドラーがあります。



結論として。





コードが実行されてなめられているとは言えませんが、逆のことですが、必要に応じてCPUに作業をすばやくロードするのに役立ちます。



CliScriptクラスのソース



誰かが同様の開発をしていて、共有する準備ができているなら、私はとても幸せです。



All Articles