Множество экземпляров PhantomJS

У меня возникла проблема при запуске нескольких экземпляров PhantomJS на Ubuntu 14. Через несколько минут процессы перестают реагировать.

Краткая история: Использование PhantomJS 2.0 для рендеринга веб-страницы, которая в конечном итоге сохраняется в формате PDF с использованием Wkhtmtopdf. PhantomJS несет ответственность только за загрузку страницы, выполнение аякс-запросов и ожидание ответа после сохранения PDF файла на сервере. Он не создает сам PDF. Существуют сотни веб-страниц, которые необходимо сгенерировать в PDF, поэтому я хочу запускать столько экземпляров PhantomJS параллельно, как позволяет система.

Каждый процесс PhantomJS запускается оболочкой script следующим образом: {path to phantomjs} {path to js file} --data {some argument} >> {path to log file} 2>&1 &

Проблема возникает через пару минут, когда я перестаю получать какие-либо результаты из процессов PhantomJS и смотрю top. Я вижу, что они просто кладут туда, ничего не делая. JS script имеет таймеры, которые затягивают загрузку страницы, если она занимает больше минуты, и в конечном итоге вызовите phantom.exit(), если страница не может загрузить/генерация PDF. Поэтому, даже если что-то пойдет не так, процесс все равно должен выйти, но это не так.

Я попытался изменить количество экземпляров PhantomJS, работающих параллельно. Пробовал 20 → 10 → 5 → 3, но это, похоже, не имеет значения. Я могу на самом деле получить гораздо больше заданий, успешно выполняющих при одновременном обслуживании 20 экземпляров.

При работе с --debug=true я вижу, что в какой-то момент он застревает  [DEBUG] WebPage - updateLoadingProgress: Также просматривая вывод, я вижу несколько таких предупреждений: [WARNING] QIODevice::write: device not open что заставляет меня думать, что это источник проблемы.

Я думал, что может существовать некоторая разногласия в отношении файловых ресурсов, поэтому я попытался без перенаправления вывода в файл журнала и не использовал --local-storage-path, но это не помогло.

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

Любая идея, что вызывает это? Кто-нибудь сталкивался с подобной проблемой? Любые рекомендации по параллельному запуску нескольких экземпляров PhantomJS?

Спасибо!

Ответ 1

Я столкнулся с такой же проблемой как локально, так и на моем CI-сервере (который также был Ubuntu). Удаление 2.0.0 и обновление до 2.1.1 разрешили проблему для меня.

Ответ 2

Я столкнулся с той же проблемой. Используйте driver.quit() вместо driver.close(). Это решило проблему для меня.