


Web Workers. Вычисляем при помощи Web Workers. Технологии будущего. Оптимизация структуры веб-страниц
Расчет освещения (RayTracing)
Отслеживание движения
Эмуляция огня
Вычисление при помощи JavaScript Web Workers
Рекомендация Web Worker (http://www.whatwg.org/specs/web-workers/current-work/) частично основывается на уже проделанной работе со стороны команды Google Gears относительно модуля WorkerPool (http://code.google.com/apis/gears/api_workerpool.html). Это идея существенно выросла и была значительно доработана, чтобы стать рекомендацией.
Worker — это скрипт, который может быть загружен и исполнен в фоновом режиме. Web Workers позволяют легко это сделать, например:
new Worker("worker.js");
В этом примере будет загружен скрипт, расположенный по адресу worker.js, а его выполнение будет произведено в фоновом режиме (скорее всего, браузеры будут использовать встроенные средства операционной системы — нити — для реализации такого поведения).
Однако есть несколько серьезных подводных камней:
1. Worker не имеет доступа к DOM. Никакого document, getElementById и т.д. (Наиболее важными исключениями из этого правила будут методы setTimeout, setInterval и XMLHttpRequest.)
2. У worker нет прямого доступа к родительской странице.
Имея в виду эти ограничения, стоит сразу задаться вопросом: а для чего, собственно, может пригодиться worker и какие задачи он способен решать?
Вы можете использовать Worker, обмениваясь с ним сообщениями. Все браузеры (которые поддерживают данную спецификацию) позволяют обмениваться строковыми сообщениями (Firefox 3.5 также поддерживает обмен JSON-совместимыми объектами). Сообщение как может быть отослано Worker, так и Worker может ответить родительской странице таким сообщением. Ниже приведен пример обмена сообщениями.
Обмен сообщениями производится при помощи API postMessage следующим образом:
var worker = new Worker("worker.js");
// Ждем сообщений от worker
worker.onmessage = function(e){
// Сообщение от клиента:
e.data;
};
worker.postMessage("start");
Клиент:
onmessage = function(e){
if ( e.data === "start" ) {
// Выполняем какие-нибудь вычисления
done();
}
};
function done(){
// Отправляем полученный результат на главную страницу
postMessage("done");
}
Это ограничение на передачу информации при помощи сообщений имеет под собой веские основания: это позволяет безопасно запускать дочерний скрипт (потому что, к счастью, он не может повлиять на родительский) и защищает родительский поток (обеспечение безопасности для DOM от вторжения из других потоков превратилось бы в ночной кошмар для клиентских разработчиков).
Прямо сейчас Web Workers присутствуют в Firefox 3.5 и Safari 4. Они также заявлены в последних ночных сборках Chromium (http://build.chromium.org/buildbot/snapshots/chromium-rel-xp/). Наверное, большинство тут же подумают: что нам до возможности, которая доступна лишь для небольшой части веб-пользователей (только в двух современных браузерах!), но это не должно быть проблемой. Web Workers позволяют эффективно использовать пользовательские машины для параллельных вычислений. В такой ситуации вы можете создавать две версии своих приложений (одну для старых браузеров, и одну — для запуска через механизм Web Workers при его наличии в браузерах). В новых браузерах это просто будет работать значительно быстрее.
Некоторые занимательные примеры использования данного механизма, которые используют заявленное API.