ホームページ >バックエンド開発 >PHPチュートリアル >PHPマルチプロセス実装コードの例

PHPマルチプロセス実装コードの例

WBOY
WBOYオリジナル
2016-07-25 08:58:32942ブラウズ
  1. //while(1)//3つのプロセスをループ
  2. //{
  3. //declare(ticks=1);
  4. $bWaitFlag = FALSE; // プロセスを待つかどうかto end
  5. //$bWaitFlag = TRUE; // プロセスの終了を待つかどうか
  6. $intNum = 3; // プロセスの総数
  7. $pids = array() // プロセスの PID 配列
  8. for($i = 0; $i <$intNum ; $i++){
  9. // 子プロセスを生成し、現在の行からテスト実行コードを開始し、親プロセスのデータ情報を継承しません
  10. $pids[$i ] = pcntl_fork();
  11. /*if($pids [$i])//親プロセス
  12. {
  13. //echo $pids[$i]."parent"."$i -> " . . "n";
  14. }
  15. */
  16. if( $pids[$i] == -1){
  17. echo "フォークできませんでした"。 "n";
  18. }elseif(!$pids[$i]) {
  19. sleep(1);
  20. echo "n". "".$i." 番目のプロセス-> " . "n";
  21. //$url=" http://xxx/comments .php?p=".$i;//キャッチ ページの例を見てみましょう
  22. //$content = file_get_contents($url);
  23. //file_put_contents('message.txt',$content);
  24. //echo "n"."th ".$i." process - > " ."Capture page".$i."-> " . time()."n";
  25. exit(0);//子プロセスは終了する必要があります。そうしないと、再帰的なマルチプロセスが発生します。それ以外の場合は、マルチプロセスを終了してください。 ;
  26. echo "wait $i -> " . time() . "n";
  27. }
  28. }
  29. //sleep(1);
  30. } //by bbs.it-home.org
  31. ?>
  32. コードをコピー
フォーク: オペレーティング システムは、親プロセスとまったく同じ子プロセスをコピーします。これは父と子の関係ですが、オペレーティング システムの観点から見ると、兄弟関係に似ています。 2 つのプロセスはコード空間を共有しますが、データ空間は互いに独立しています。子プロセスのデータ空間の内容は親プロセスの完全なコピーであり、命令ポインタもまったく同じです。 ただし、1 つだけ違いがあります。fork が成功した場合、子プロセスの fork の戻り値は 0 になります。fork が失敗した場合、親プロセスの fork の戻り値は子プロセスのプロセス番号になります。エラーが返されます
2 つのプロセスは同時に同じペースで実行されており、フォーク後は異なるタスクを実行します。つまり、分岐します。これがフォークがフォークと呼ばれる理由です。

どちらが先に実行されるかについては、オペレーティング システムに関連する可能性があり、この問題は実際のアプリケーションでは重要ではありません。親子プロセスの調整が必要な場合は、プリミティブによって解決できます。

子プロセスはfork前は親プロセスのものを引き継ぐことができますが、fork後は子プロセスは親プロセスとの継承関係を持ちません。子プロセスで作成したものは子プロセスに属し、親プロセスで作成したものは親プロセスに属します。完全に2つのプロセスとして捉えることができます。

プログラムセグメントで fork(); を使用した後、プログラムは分岐し、2 つのプロセスを生成しました。どちらが最初に実行されるかは、システムのスケジューリング アルゴリズムによって異なります。

「pid=fork();」を実行すると、システムはメインプログラムとまったく同じサブプロセスを生成すると考えられます。プロセスの「pid=fork();」文の pid は子プロセス自体の pid であり、子プロセスの終了後は親プロセスの「pid=fork();」の pid になります。親プロセス自体の。したがって、変更されたプログラムには 2 行の出力が含まれます。

fork() 関数は、現在のプロセスの PCB をコピーし、派生した子プロセスの PID を親プロセスに返します。さらに、上記の "corand" 兄弟のヒントによると、父プロセスと息子プロセスは並列であり、ステートメントの印刷順序はシステムのスケジューリング アルゴリズムに完全に依存します。印刷されるコンテンツは pid 変数によって制御されます。 fork() が派生子プロセスの pid を親プロセスに返し、これは正の整数であり、派生子プロセスの pid 変数は変更されていないことがわかっているためです。この違いにより、それぞれの異なる出力を確認できるようになります。

1. 子プロセスを派生するプロセス、つまり親プロセスは同じ pid を持ちます。

2. 子プロセスの場合、fork は 0 を返しますが、その pid が 0 になることはありません。それは、子プロセスがいつでも getpid() を呼び出して独自の pid を取得できるためです。

3. フォーク後のマスタープロセスに同期を使用しない限り、誰が最初に実行するか、誰が最初に終了するかを判断することはできません。 子プロセスが終了した後にのみ親プロセスが fork から戻ると考えるのは間違いです。これは fork の場合ではなく、vfork の場合には当てはまります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。