php - 我怎样才能强制执行最大数量的 fork child ?

标签 php c fork process-management

编辑:我已将此 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);
}

我设法让它在 $items 上与 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 个 child 。处理这个问题的最佳方法是什么?我尝试了一些方法,但运气不佳。

最佳答案

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

--ppid 开关将列出您处理的所有子项,因此您只需要计算 ps 输出的行数。

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

关于php - 我怎样才能强制执行最大数量的 fork child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/336250/

相关文章:

php - 带有 PHP header 的跨域请求 header (CORS)

c - 我该如何改进这个 Makefile?

c - 共享内存在 C 中不与进程共享

c - 重定向到 execlp()

php - 匹配前缀和多个可选后缀,无分隔符

javascript - 动态创建一个选择,然后更改 ajax 调用以附加 html

clang 中的代码覆盖率

c - c中可以分配大数组吗?

c - 如何将 POSIX 系统调用 fork() 和 wait() 移植到 Visual Studio 2010 Express?

php - MySql 连接两个表且不重复