2016-02-29 2 views
1

У меня есть PHP-скрипт, выполняющий вычисления по набору изображений. Как правило, обработка одного набора изображений занимает 30 секунд.PHP - многопроцессорная обработка медленнее, чем одиночная обработка

Родительский процесс разворачивается один или несколько раз, чтобы выполнять вычисления на разных наборах изображений одновременно. Выполняются вычисления только дочерние процессы.

У меня есть 8 ядер на моей машине Ubuntu, с SSD-диск

Когда я раскошелиться родительский процесс только один раз, так что у меня есть родительский процесс и дочерний процесс, дочерний процесс завершает расчеты по изображение установлено за 30 секунд.

Если я обработаю родительский процесс дважды (так что один родительский и два дочерних процесса), каждый ребенок занимает около 100 секунд для выполнения своей задачи.

Если я обработаю родительский процесс четыре раза (так что один родительский и четыре дочерних процесса), каждый ребенок занимает около 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

Есть ли зависимости между вашим разветвленным процессом? я имею в виду ** Процесс А **, ожидающий освобождения ресурса ** процессом 2 ** ?? –

+0

Нет, они полностью независимы – David

ответ

0

ImageMagick был виновником. Похоже, что Image magick по умолчанию выделил 8 потоков для каждого ресурса. Количество нити может быть получен, как показано ниже

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

Следовательно, было слишком много потоков при использовании нескольких обработки

я ограничил число потоков следующим

$image->setresqourcelimit(6,2);// 2 threads 

После этого, многократная обработка работала как ожидалось

Смежные вопросы