我有一个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对象中并处理这些图像。
我错过了什么吗?
答案 0 :(得分:0)
ImageMagick是罪魁祸首。看起来Image magick默认为每个资源分配了8个线程。可以检索线程数,如下所示
B
因此,使用多处理时线程太多了
我限制了线程数如下
$image->getresourcelimit(6);// 6 = nb threads
之后,多处理按预期工作