微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何强制执行最大数量的分叉子项?

编辑:我已经标记了这个C,希望得到更多回复.它比我特定的语言实现更感兴趣.因此,如果您是C编码器,请将以下PHP视为伪代码,并随时回答用C编写的答案.

我试图通过并行执行其任务而不是串行来加速PHP CLI脚本.任务完全相互独立,因此它们开始/结束的顺序无关紧要.

这是原始脚本(注意所有这些示例都是为了清晰起见而被剥离):

<?PHP

$items = range(0, 100);

function do_stuff_with($item) { echo "$item\n"; }

foreach ($items as $item) {
    do_stuff_with($item);
}

我已设法使其与pcntl_fork()并行的$项目工作,如下所示:

<?PHP

ini_set('max_execution_time', 0); 
ini_set('max_input_time', 0); 
set_time_limit(0);

$items = range(0, 100);

function do_stuff_with($item) { echo "$item\n"; }

$pids = array();
foreach ($items as $item) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("Couldn't fork()");
    } elseif ($pid > 0) {
        // parent
        $pids[] = $pid;
    } else {
        // child
        do_stuff_with($item);
        exit(0);
    }   
}

foreach ($pids as $pid) {
    pcntl_waitpid($pid, $status);
}

现在我想扩展这个,所以最多有10个孩子一次活动.处理这个问题的最佳方法是什么?我尝试过一些东西,但运气不好.

解决方法:

没有系统调用获取子pid列表,但ps可以为您完成.

–ppid switch会列出你所有的子进程,所以你只需要计算ps输出的行数.

或者,您可以维护自己的计数器,您将在fork()上递增并递减SIGCHLD信号,假设ppid保持不变以进行fork’ed处理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐