PHP - 多次处理比单次处理慢

时间:2016-02-29 13:12:22

标签: php process

我有一个PHP脚本在一组图像上进行计算。通常,处理一组图像需要30秒。

父进程被分叉一次或多次,以便同时对不同的图像集进行计算。只有子进程执行计算。

我的Ubuntu机器上有8个内核,带有SSD驱动器

当我只将父进程分叉一次,因此我已经获得父进程和子进程时,子进程在大约30秒内完成对映像集的计算。

如果我将父进程分叉两次(所以1个父进程和两个子进程),每个子进程大约需要100秒才能完成其任务。

如果我将父进程分叉四次(所以1个父进程和4个子进程),每个子进程大约需要230秒来完成其任务。

while (false !== ($nextTask = $this->selectNextTask())) 
{
        $pid = pcntl_fork();
        if ($pid == -1) 
        {
           //Fork failed
            continue;
        } 
        else if ($pid) {
            // In parent process
            $tasks[$pid] = $nextTask;
            $nextTask->initialize($pid);
            continue;
        } 
        else 
        {
         $nextTask->run(); //Actual Calculations
            exit(0); //end of child process
        }
}

//Parent process then waits for all child processes to complete

实际处理将来自磁盘的图像加载到ImageMagik对象中并处理这些图像。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

ImageMagick是罪魁祸首。看起来Image magick默认为每个资源分配了8个线程。可以检索线程数,如下所示

B

因此,使用多处理时线程太多了

我限制了线程数如下

$image->getresourcelimit(6);// 6 = nb threads

之后,多处理按预期工作