编辑:我已经标记了这个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个孩子一次活动.处理这个问题的最佳方法是什么?我尝试过一些东西,但运气不好.
解决方法:
–ppid switch会列出你所有的子进程,所以你只需要计算ps输出的行数.
或者,您可以维护自己的计数器,您将在fork()上递增并递减SIGCHLD信号,假设ppid保持不变以进行fork’ed处理.