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 воркеров.

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

| Specification |
| --- |
| HTML Living Standard # workers |

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

* Использование Web воркеров (en-US)
* Worker Interface
* Интерфейс SharedWorker
* ServiceWorker API (en-US)
* Функции и классы доступные воркерам (en-US)
* Продвинутые концепции и примеры (en-US)
* ChromeWorker: для использования воркеров в привелегированном/chrome коде