编辑:我已将此 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/