Веб -воркер , как определено Консорциумом Всемирной паутины (W3C) и Рабочей группой по технологиям веб-гипертекстовых приложений (WHATWG), представляет собой скрипт JavaScript, выполняемый с HTML -страницы, которая работает в фоновом режиме , независимо от скриптов, которые также могли быть выполнены с той же HTML-страницы. [1] Веб-воркеры часто способны более эффективно использовать многоядерные процессоры . [2]
W3C и WHATWG рассматривают веб-работников как долго работающие скрипты, которые не прерываются скриптами, реагирующими на щелчки или другие действия пользователя. Предотвращение прерывания таких работников действиями пользователя должно позволить веб-страницам оставаться отзывчивыми, в то же время выполняя длительные задачи в фоновом режиме.
Спецификация веб-воркера является частью HTML Living Standard. [1]
По замыслу WHATWG, веб-воркеры относительно тяжеловесны и не предназначены для использования в больших количествах. Ожидается, что они будут долгоживущими, с высокой стоимостью начальной производительности и высокой стоимостью памяти на экземпляр. [1]
Веб-работники работают вне контекста скриптов HTML-документа. Следовательно, хотя у них нет доступа к DOM , они могут способствовать одновременному выполнению программ JavaScript.
Веб-воркеры взаимодействуют с основным документом посредством передачи сообщений . Следующий код создает Worker, который выполнит JavaScript в указанном файле.
var worker = new Worker ( "worker_script.js" );
Для отправки сообщения работнику postMessage
используется метод объекта работника, как показано ниже.
worker.postMessage ( "Привет, мир! " ) ;
Свойство onmessage
использует обработчик событий для получения информации от работника.
worker.onmessage = function ( event ) { alert ( "Получено сообщение" + event.data ) ; doSomething ( ) ; } function doSomething ( ) { // выполнить работу worker.postMessage ( "Работа выполнена!" ); } работник . завершить ();
После завершения работы рабочего процесса он выходит из области действия, а ссылающаяся на него переменная становится неопределенной; в этот момент при необходимости необходимо создать нового рабочего процесса.
Простейшим применением веб-воркеров является выполнение ресурсоемких вычислительных задач без прерывания работы пользовательского интерфейса.
В этом примере основной документ запускает веб-воркер для вычисления простых чисел и постепенно отображает последнее найденное простое число.
Главная страница выглядит следующим образом:
<!DOCTYPE html> < html > < head > < title > Пример Worker: одноядерные вычисления </ title > </ head > < body > < p > Наибольшее простое число, обнаруженное на данный момент: < output id = "result" ></ output ></ p > < script > var worker = new Worker ( 'worker.js' ); worker . onmessage = function ( event ) { document . getElementById ( 'result' ). textContent = event . data ; }; </ script > </ body > </ html >
Вызов конструктора Worker()
создает веб-воркера и возвращает worker
объект, представляющий этого веб-воркера, который используется для связи с веб-воркером. onmessage
Обработчик событий этого объекта позволяет коду получать сообщения от веб-воркера.
Сам Web Worker выглядит следующим образом:
var n = 1 ; var end_value = 10 ** 7 ; поиск : while ( n <= end_value ) { n ++ ; for ( var i = 2 ; i <= Math . sqrt ( n ); i ++ ) if ( n % i == 0 ) продолжить поиск ; // найдено простое число! postMessage ( n ); }
Чтобы отправить сообщение обратно на страницу, postMessage()
используется метод публикации сообщения при обнаружении простого числа. [1]
Если браузер поддерживает веб-воркеров, свойство Worker будет доступно в глобальном объекте окна. [3] Свойство Worker будет неопределенным, если браузер его не поддерживает.
Следующий пример кода проверяет поддержку веб-воркера в браузере.
function browserSupportsWebWorkers () { return typeof window.Worker === " function " ; }
В настоящее время веб-воркеры поддерживаются Chrome , Opera , Edge , Internet Explorer (версия 10), Mozilla Firefox и Safari . [4] [5] [6] Мобильный Safari для iOS поддерживает веб-воркеры с iOS 5. Браузер Android впервые поддержал веб-воркеры в Android 2.1, но поддержка была удалена в версиях Android 2.2–4.3, прежде чем была восстановлена в Android 4.4. [7] [8]