Как справиться с массовыми вычислениями на веб-сайтах? Веб-воркеры или CGI?

Я написал веб-сайт на основе JavaScript, который может вводить, редактировать и решать нонограммы. Как вы, возможно, знаете, решение кроссворда — это NP-полная задача.

Моей первой попыткой был чистый (однопоточный) JavaScript. Но на больших нонограммах Chrome показывал свой BSOD и убивал JS-скрипт через несколько минут. Следующей попыткой было использование Web Workers. Я разделяю алгоритм решения так, чтобы каждый работник получал одну строку/столбец для решения и возвращал результат. Это было улучшением, и он мог решать нонограммы среднего размера. Но, тем не менее, иногда браузер убивал виртуальную машину JS, показывающую BSOD через некоторое время, плюс веб-сайт не совсем отвечал, как я ожидал, поскольку для этого созданы веб-воркеры, не так ли?

Просто для «забавы» я перенес алгоритм решения на Python и использовал ajax-запросы, вызывающие скрипт Python вместо Web Workers. Интересно, что он был даже медленнее, чем JavaScript, но после некоторого времени вычислений запрос возвращал 500 Internal Server Error. Я считаю, что это связано с максимальным временем выполнения CGI-скрипта, которое на PHP составляет 30 секунд.

Идея CGI была не лучшей, потому что, когда несколько пользователей хотят решить нонограмму, сервер работает на 100% ЦП, поэтому я, вероятно, придерживаюсь вычислений на стороне клиента.

Итак, вопрос в том, как лучше всего выполнить это вычисление (которое может занять около 10 минут для больших нонограмм)? Я думаю, что время выполнения не является проблемой, пока веб-сайт остается в ответе и пока браузер не убивает задачи выполнения.

Тем временем я также пытаюсь оптимизировать рекурсивный алгоритм....

Спасибо!


person jaw    schedule 18.03.2012    source источник


Ответы (1)


Возможно, вы могли бы добавить некоторую задержку перед отправкой сообщений в папку WebWorkers. Если процесс разбит на достаточно мелкие функции, можно сохранить отзывчивость страницы, хотя решение проблемы займет гораздо больше времени.

person Jeffrey Sweeney    schedule 18.03.2012
comment
Я уже сделал. Я использую gif, который показывает, что браузер в настоящее время решает. Я использовал jQuery show/hide. Но он не появился, когда я сразу запускаю рабочие. Поэтому я ввел задержку в 2 секунды. Но как только рабочие начинают расчет, а процессы хрома запускаются на 100% ЦП, веб-сайт перестает отвечать на запросы. - person jaw; 19.03.2012
comment
@ebeb А ты уверен, что рядом с ним постоянно ничего не крутилось? Нам, вероятно, нужно увидеть какой-то код, прежде чем можно будет дать более определенный ответ. - person Jeffrey Sweeney; 19.03.2012
comment
Да, я уверен, потому что, как только я заменяю вызов Worker postMessage вызовом ajax для использования версии Python, страница становится отзывчивой. Я пытаюсь собрать короткий пример, иллюстрирующий проблему. - person jaw; 25.03.2012