Web Workers API

Web Workers это механизм, который позволяет скрипту выполняться в фоновом потоке, который отделен от основного потока веб-приложения. Преимущество заключается в том, что ресурсоёмкие вычисления могут выполняться в отдельном потоке, позволяя запустить основной (обычно пользовательский) поток без блокировки и замедления.

Концепции и использование Web воркеров

Worker (работник, воркер) - это объект созданный при помощи конструктора (например, Worker()), который запускает именованный файл JavaScript - этот файл содержит код, который будет запускаться в потоке воркера; воркеры запускаются в другом глобальном контексте отличном от текущего контекста window. Этот контекст представлен объектом DedicatedWorkerGlobalScope (en-US) в случае специализированных воркеров (стандартные воркеры, которые используются одним скриптом, общие воркеры используют SharedWorkerGlobalScope (en-US)).

Вы можете запустить любой код, который вам нравится внутри потока воркера, за некоторыми исключениями. Например, вы не можете напрямую манипулировать DOM внутри воркера или использовать некоторые методы и свойства по умолчанию объекта window. Но вы можете использовать большое количество свойств и методов, доступных в window, включая WebSockets, и механизм хранения данных такой, как IndexedDB или Data Store API, который доступен только в ОС Firefox. За дополнительной информацией смотрите Функции и классы доступные воркерам. (en-US)

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

Воркеры могут, в свою очередь, создавать новых воркеров, в этом случае они должны иметь одно и то же происхождение - родительскую страницу. Кроме того, воркеры могут использовать XMLHttpRequest для сетевого ввода-вывода, за исключением того, что атрибуты responseXML и channel на XMLHttpRequest всегда возвращают значение null.

В дополнение к специализированным существуют и другие виды воркеров:

  • Совместные воркеры - это воркеры, которые могут использоваться несколькими скриптами совместно, работающими в разных окнах, IFrames и т.д. в пределах одного домена, что и воркер. Они немного сложнее, чем специализированные воркеры - скрипты должны связываться через активный порт. Подробнее см. SharedWorker.
  • ServiceWorkers (en-US) по сути действуют как прокси-серверы, которые находятся между веб-приложениями, а также браузером и сетью (если доступны). Помимо прочего они предназначены для создания эффективного автономного взаимодействия, перехвата сетевых запросов и принятия соответствующих мер на основе доступности сети и обновления данных на сервере. Они также позволят доступ к push-уведомлениям и API-интерфейсам фоновой синхронизации.
  • Воркеры в Chrome - это воркеры специального типа Firefox, которые вы можете использовать, если вы разрабатываете надстройки и хотите использовать воркеры в расширениях и иметь доступ к js-ctypes в вашем воркере. Смотрите также ChromeWorker.
  • Audio Workers(аудио воркеры) обеспечивают возможность прямой обработки аудиозаписей в рамках веб-контекста воркера.

Примечание: В соответствии с Web workers Spec, события ошибок воркеров не должны "всплывать" (смотрите Firefox bug 1188141. Такое поведение было реализовано в Firefox 42.

Интерфейсы Web воркера

AbstractWorker (en-US)

Абстрактные свойства и методы общие для всех типов воркеров (т.е. Worker или SharedWorker).

Worker

Представляет поток исполнения воркера, позволяющий передавать сообщения текущему коду воркера.

SharedWorker

Представляет конкретный вид воркера, к которому можно получить доступ из нескольких контекстов, будь то несколько окон, iframe или даже воркеров.

WorkerGlobalScope (en-US)

Represents the generic scope of any worker (doing the same job as Window does for normal web content). Different types of worker have scope objects that inherit from this interface and add more specific features.

DedicatedWorkerGlobalScope (en-US)

Represents the scope of a dedicated worker, inheriting from WorkerGlobalScope (en-US) and adding some dedicated features.

SharedWorkerGlobalScope (en-US)

Represents the scope of a shared worker, inheriting from WorkerGlobalScope (en-US) and adding some dedicated features.

WorkerNavigator (en-US)

Представляет идентификатор и состояние пользовательского агента (клиента).

Примеры

Мы создали пару простых демонстрационных программ чтобы показать основы использования:

Больше информации о том, как работают эти демонстрационные программы, вы можете найти в статье Использование Web воркеров.

Спецификации

Смотрите также