nirex
Новичок
Не получается управлять дочерними процессами (pcntl_fork)
Привет всем.
У меня не получается управлять дочерними процессами, т.е. есть цикл "заданий" который запускает форки , но т.к. заданий может быть много значит надо ограничить число форков .
пока максимум дочерних задействовано нечего не делать , как только освобождается место , сразу запускать еще один дочерний процесс.
Напишите пожалуйста пример , а то что-то не получается . долго бился , но нечего так и не сделал.
я пытался реализовать это так :
$max_fork=3
$childrenNow=0;
for(задания){
while($childrenNow>=$max_fork){sleep(5);}
$pid = pcntl_fork();
if ( $pid == -1 ) {
die( "error\n" );
} elseif ( $pid == 0 ) {
$childrenNow++;
}else{
global $childrenNow;
include_once("main1.php");
simple_download($id,$folder_id,$cell_name,$cell_desc);
$query="update `tmpl` set `complete`='1' where `id`=\"$tempid\"";
$result = mysql_query($query);
if(!$result)mysql_eror();
echo $childrenNow--;
posix_kill(posix_getpid(), SIGTERM);
}
таким способом я смог добиться только того что он раз выполняет максимум заданий и не дополняет их а когда дочернии заканчивают работу родитель не выходит.
Привет всем.
У меня не получается управлять дочерними процессами, т.е. есть цикл "заданий" который запускает форки , но т.к. заданий может быть много значит надо ограничить число форков .
пока максимум дочерних задействовано нечего не делать , как только освобождается место , сразу запускать еще один дочерний процесс.
Напишите пожалуйста пример , а то что-то не получается . долго бился , но нечего так и не сделал.
я пытался реализовать это так :
$max_fork=3
$childrenNow=0;
for(задания){
while($childrenNow>=$max_fork){sleep(5);}
$pid = pcntl_fork();
if ( $pid == -1 ) {
die( "error\n" );
} elseif ( $pid == 0 ) {
$childrenNow++;
}else{
global $childrenNow;
include_once("main1.php");
simple_download($id,$folder_id,$cell_name,$cell_desc);
$query="update `tmpl` set `complete`='1' where `id`=\"$tempid\"";
$result = mysql_query($query);
if(!$result)mysql_eror();
echo $childrenNow--;
posix_kill(posix_getpid(), SIGTERM);
}
таким способом я смог добиться только того что он раз выполняет максимум заданий и не дополняет их а когда дочернии заканчивают работу родитель не выходит.