Статьи

JavaScript Threading с веб-работниками HTML5

Забудьте о трансформациях, нативном видео, семантических тегах и прочей бессмысленной чепухе в HTML5; веб-работники — лучшая функция для браузеров, так как JavaScript! Наконец, веб-работники позволяют разработчикам запускать текущие процессы в отдельном потоке.

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

Ограничения веб-работника

Веб-работники работают независимо от потока пользовательского интерфейса браузера, поэтому они не могут получить доступ ко многим функциям, которые разработчики JavaScript знают и любят. Основным ограничением является то, что веб-работники не имеют доступа к DOM; они не могут читать или изменять HTML-документ. Кроме того, вы не можете получить доступ к глобальным переменным или функциям JavaScript на странице. Наконец, доступ к некоторым объектам ограничен, например, свойства window.location доступны только для чтения.

Однако веб-работники могут использовать стандартные типы данных JavaScript, обрабатывать вызовы XMLHttpRequest (Ajax), использовать таймеры и даже импортировать других работников. Они идеально подходят для трудоемких задач, таких как анализ больших блоков данных, логика игрового ИИ, трассировка лучей и т. Д.

Поддержка Web Worker Browser

На момент написания статьи все последние версии Firefox, Chrome, Safari и Opera в некоторой степени поддерживают веб-работников. Угадайте, какой браузер отсутствует?

Неудивительно, что веб-работники не реализованы ни в одной версии Internet Explorer. Даже IE9 не предлагает поддержку, но я подозреваю / надеюсь, что она будет реализована в финальной версии. До этого времени у вас есть три варианта:

  • Забудьте о веб-работниках еще на год или два.
  • Примите, что ваше приложение сломается в IE.
  • Реализуйте свой собственный веб-инструмент, который использует псевдопоточность на основе таймера или обработку массива . Это может быть не возможно или не желательно во всех приложениях.

Что такое веб-работник?

Веб-работник — это отдельный файл JavaScript, загружаемый и выполняемый в фоновом режиме. Есть два типа:

  • Выделенные работники : они связаны с их создателем (сценарий, который загрузил работника).
  • Совместно используемые работники : позволяют любому сценарию из того же домена (somesite.com) взаимодействовать с работником.

Сегодня мы смотрим на посвященных веб-работников …

Создание выделенного веб-работника

Чтобы создать выделенного веб-работника, вы передаете имя файла JavaScript новому экземпляру объекта Worker:

var worker = new Worker("thread1.js"); 

Общение с выделенным веб-работником

Поскольку веб-работник не может получить доступ к DOM или выполнить функции в скрипте страницы, все взаимодействие осуществляется через интерфейс событий. Сценарий веб-страницы передает один аргумент данных с помощью метода postMessage() и получает его обратно через onmessage события onmessage , например

pagescript.js:

 var worker = new Worker("thread1.js"); // receive messages from web worker worker.onmessage = function(e) { alert(e.data); }; // send message to web worker worker.postMessage("Jennifer"); 

Сценарий веб-работника получает и отправляет данные через собственный onmessage события onmessage и метод postMessage() соответственно:

thread1.js:

 self.onmessage = function(e) { self.postMessage("Hello " + e.data); }; 

Данные сообщения могут быть строкой, числом, логическим значением, массивом, объектом, нулевым или неопределенным. Данные всегда передаются по значению и сериализуются, а затем десериализуются в процессе обмена данными.

Обработка выделенных ошибок веб-работника

Код веб-работника вряд ли будет идеальным, и логические ошибки могут быть вызваны данными, передаваемыми скриптом страницы. К счастью, ошибки могут быть обнаружены с помощью обработчика события onerror. В событие обработчика передается объект с 3 свойствами:

  • filename : имя скрипта, вызвавшего ошибку;
  • lineno : номер строки, где произошла ошибка; и
  • сообщение : описание ошибки.

pagescript.js:

 worker.onerror = function(e) { alert("Error in file: "+e.filename+"nline: "+e.lineno+"nDescription: "+e.message); }; 

Загрузка дополнительных файлов JavaScript

Одна или несколько дополнительных библиотек JavaScript могут быть загружены внутри веб-работника с помощью importScripts() , например

 importScripts("lib1.js", "lib2.js", "lib3.js"); 

В качестве альтернативы, вы могли бы загружать дополнительных веб-работников … но я бы рекомендовал сделать это простым, пока браузеры не догонят ваши амбиции по созданию потоков!

Остановка выделенного веб-работника

Поток веб-работника может быть остановлен с помощью метода close() , например

thread1.js:

 self.onmessage = function(e) { if (e.data == "STOP!") self.close(); }; 

Это отбрасывает любые задачи, ожидающие обработки, и предотвращает дальнейшие события в очереди.

Это все, что вам нужно знать о специализированных веб-работниках. В моем следующем посте мы обсудим общих веб-работников — более сложного зверя!