php:マルチプロセス実行タスク

6635 ワード

需要
指定した数の複数のタスクを同時に実行し、プロセス数を制御します.
プロセス&スレッド:
プロセス間は互いに独立しており、影響しません.
コードの例:
";
       exit(1);
   }
   //   ,     pid
   elseif($processid){
       $task++; //     

       $currentProcessid = posix_getpid(); //     Id
       $parentProcessid = posix_getppid(); //      ID
       $phpProcessid = getmypid(); //  php   id
       echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"
"; // if($task ?>= $processNumLimit) { echo "wait chl start!
"; $exitid = pcntl_wait($status); // echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"
"; } // if($task >= $taskNum) { echo "taskNum enough!
"; break; } } //processid=0 else{ // $sleep = rand(1, 5); $currentProcessid = posix_getpid(); // Id $parentProcessid = posix_getppid(); // ID $phpProcessid = getmypid(); // php id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!
"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!
"; exit(0); // , } }

実行結果:
task:1    processid:32225    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
task:0    processid:0    currentProcessid:32225    parentProcessid:32224    phpProcessid:32225    sleep:5    begin!
task:2    processid:32226    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:1    processid:0    currentProcessid:32226    parentProcessid:32224    phpProcessid:32226    sleep:2    begin!
task:1    processid:0    currentProcessid:32226    parentProcessid:32224    phpProcessid:32226    sleep:2    end!
wait chl end!extid:32226    status:0
task:3    processid:32228    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:2    processid:0    currentProcessid:32228    parentProcessid:32224    phpProcessid:32228    sleep:1    begin!
task:2    processid:0    currentProcessid:32228    parentProcessid:32224    phpProcessid:32228    sleep:1    end!
wait chl end!extid:32228    status:0
task:4    processid:32229    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:3    processid:0    currentProcessid:32229    parentProcessid:32224    phpProcessid:32229    sleep:2    begin!
task:0    processid:0    currentProcessid:32225    parentProcessid:32224    phpProcessid:32225    sleep:5    end!
wait chl end!extid:32225    status:0
task:5    processid:32270    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:4    processid:0    currentProcessid:32270    parentProcessid:32224    phpProcessid:32270    sleep:1    begin!
task:3    processid:0    currentProcessid:32229    parentProcessid:32224    phpProcessid:32229    sleep:2    end!
wait chl end!extid:32229    status:0
task:6    processid:32271    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:5    processid:0    currentProcessid:32271    parentProcessid:32224    phpProcessid:32271    sleep:4    begin!
task:4    processid:0    currentProcessid:32270    parentProcessid:32224    phpProcessid:32270    sleep:1    end!
wait chl end!extid:32270    status:0
task:7    processid:32273    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:6    processid:0    currentProcessid:32273    parentProcessid:32224    phpProcessid:32273    sleep:1    begin!
task:6    processid:0    currentProcessid:32273    parentProcessid:32224    phpProcessid:32273    sleep:1    end!
wait chl end!extid:32273    status:0
task:8    processid:32274    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:7    processid:0    currentProcessid:32274    parentProcessid:32224    phpProcessid:32274    sleep:2    begin!
task:5    processid:0    currentProcessid:32271    parentProcessid:32224    phpProcessid:32271    sleep:4    end!
task:7    processid:0    currentProcessid:32274    parentProcessid:32224    phpProcessid:32274    sleep:2    end!
wait chl end!extid:32274    status:0
task:9    processid:32277    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
wait chl end!extid:32271    status:0
task:8    processid:0    currentProcessid:32277    parentProcessid:32224    phpProcessid:32277    sleep:2    begin!
task:10    processid:32278    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:9    processid:0    currentProcessid:32278    parentProcessid:32224    phpProcessid:32278    sleep:2    begin!
task:8    processid:0    currentProcessid:32277    parentProcessid:32224    phpProcessid:32277    sleep:2    end!
task:9    processid:0    currentProcessid:32278    parentProcessid:32224    phpProcessid:32278    sleep:2    end!
wait chl end!extid:32277    status:0
taskNum enough

解析の実行:
  • pcntl_forkがサブプロセスを作成した後、サブプロセスは機能コードを実行し、親プロセスはタスクidを増やし続け、次のタスクプロセスを作成する.
  • pcntlを通過waitはサブプロセスの実行が完了して終了した後、新しくプロセスを作成し、プロセス総数の制御を実現する.
  • メインプロセスの作成が完了した後、breakを介してループを終了します.サブプロセスが続行される可能性があります.

  • 関連関数:
    pcntl_fork
    現在のプロセスの現在位置にブランチ(サブプロセス)が生成されます.成功すると、親プロセス実行スレッド内で生成されたサブプロセスのPIDが返され、サブプロセス実行スレッド内で0が返されます.失敗すると、親プロセスコンテキストで-1が返され、サブプロセスは作成されず、PHPエラーが発生します.
    pcntl_wait
    forkのサブプロセスステータスを待機または返します.wait関数は、サブプロセスが終了するか、信号が受信されるまで、現在のプロセスを中断するか、信号処理関数を呼び出すまで、現在のプロセスの実行を開始する.サブプロセスがこの関数を呼び出したときに終了した場合(ゾンビプロセスと呼ばれる)、この関数はすぐに戻ります.サブプロセスで使用されるすべてのシステムリソースが解放されます.
    その他:
    1.ゾンビプロセスと孤児プロセスの問題
    一部のゾンビプロセスはpcntl_waitはステータスを取得してリソースを解放し、引き継いでいないプロセスはメインプロセスが終了した後に孤児プロセスとなる.孤児プロセスはinitプロセスによって養子縁組され、waitの状態取得と資源解放を完了する.