php:マルチプロセス実行タスク
需要
指定した数の複数のタスクを同時に実行し、プロセス数を制御します.
プロセス&スレッド:
プロセス間は互いに独立しており、影響しません.
コードの例:
実行結果:
解析の実行: pcntl_forkがサブプロセスを作成した後、サブプロセスは機能コードを実行し、親プロセスはタスクidを増やし続け、次のタスクプロセスを作成する. pcntlを通過waitはサブプロセスの実行が完了して終了した後、新しくプロセスを作成し、プロセス総数の制御を実現する. メインプロセスの作成が完了した後、breakを介してループを終了します.サブプロセスが続行される可能性があります.
関連関数:
pcntl_fork
現在のプロセスの現在位置にブランチ(サブプロセス)が生成されます.成功すると、親プロセス実行スレッド内で生成されたサブプロセスのPIDが返され、サブプロセス実行スレッド内で0が返されます.失敗すると、親プロセスコンテキストで-1が返され、サブプロセスは作成されず、PHPエラーが発生します.
pcntl_wait
forkのサブプロセスステータスを待機または返します.wait関数は、サブプロセスが終了するか、信号が受信されるまで、現在のプロセスを中断するか、信号処理関数を呼び出すまで、現在のプロセスの実行を開始する.サブプロセスがこの関数を呼び出したときに終了した場合(ゾンビプロセスと呼ばれる)、この関数はすぐに戻ります.サブプロセスで使用されるすべてのシステムリソースが解放されます.
その他:
1.ゾンビプロセスと孤児プロセスの問題
一部のゾンビプロセスはpcntl_waitはステータスを取得してリソースを解放し、引き継いでいないプロセスはメインプロセスが終了した後に孤児プロセスとなる.孤児プロセスはinitプロセスによって養子縁組され、waitの状態取得と資源解放を完了する.
指定した数の複数のタスクを同時に実行し、プロセス数を制御します.
プロセス&スレッド:
プロセス間は互いに独立しており、影響しません.
コードの例:
";
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
現在のプロセスの現在位置にブランチ(サブプロセス)が生成されます.成功すると、親プロセス実行スレッド内で生成されたサブプロセスのPIDが返され、サブプロセス実行スレッド内で0が返されます.失敗すると、親プロセスコンテキストで-1が返され、サブプロセスは作成されず、PHPエラーが発生します.
pcntl_wait
forkのサブプロセスステータスを待機または返します.wait関数は、サブプロセスが終了するか、信号が受信されるまで、現在のプロセスを中断するか、信号処理関数を呼び出すまで、現在のプロセスの実行を開始する.サブプロセスがこの関数を呼び出したときに終了した場合(ゾンビプロセスと呼ばれる)、この関数はすぐに戻ります.サブプロセスで使用されるすべてのシステムリソースが解放されます.
その他:
1.ゾンビプロセスと孤児プロセスの問題
一部のゾンビプロセスはpcntl_waitはステータスを取得してリソースを解放し、引き継いでいないプロセスはメインプロセスが終了した後に孤児プロセスとなる.孤児プロセスはinitプロセスによって養子縁組され、waitの状態取得と資源解放を完了する.