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处理.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...