предисловие
Ведение блога в основном используется для обобщения, закрепления знаний и углубления вашего понимания этого знания. Также надеемся на помощь нуждающимся. Если есть какое-то неправильное место. Вы можете указать это в комментариях. твоя поддержка. Это источник моего постоянного совершенствования.
Кратко объяснить
Это вопрос собеседования, сначала интервьюер объяснил мне, как работать с большими объемами данных во фронтенде. Я ляпнул про использование пейджинга с первого раза! Интервьюер сказал, что это было из-за кулис. А как насчет фронтенда? эммммм... Я думал об этом, пакетная загрузка, ленивая загрузка. Отслеживайте скользящие данные дисплея пользователя в пакетном режиме. Затем я спросил, хочу ли я делать вычисления на этих больших объемах данных, и в то же время я не могу допустить, чтобы страница рухнула и инсценировала смерть. Как это сделать? Сразу же я был ошеломлен, это. . Как это работает. Разве это не должно быть сделано в фоновом режиме, если вы хотите выполнять вычисления?
И как можно сразу передать столько данных во внешний интерфейс,~~
Жалоба есть жалоба, Тукао есть Тукао~~
Позже я спросил интервьюера об общей идее реализации. Позже интервьюер сказал, что это было достигнуто за счет воркеров в качестве подпотоков.
Хорошо, тогда давайте узнаем об этом работнике
что такое рабочий
运行者 Worker 接口是Web Workers API的一部分,代表一个后台任务,
它容易被创建并向创建者发回消息。创建一个运行者只要简单的调用Worker()构造函数,指定一个脚本,在工作线程中执行。(引自MDN)
Это может быть немного скучно смотреть на концепцию.С точки зрения непрофессионала, это так: поскольку js работает в одном потоке, при столкновении с некоторыми js, которые должны обрабатывать большой объем данных, он может блокировать загрузку страницы и привести к зависанию страницы. В настоящее время мы можем использовать worker для открытия подпотока, независимого от основного потока, для выполнения большого количества операций. Это не приведет к зависанию страницы. Это также показывает, что рабочие процессы могут быть использованы для решения проблемы, связанной с тем, что большое количество операций приводит к зависанию страницы.
рабочий синтаксис
const worker=new Worker(aURL, options)
Он имеет два параметра:
aURL (обязательно) — это DOMString, представляющая URL-адрес сценария, который будет выполнять рабочий процесс. Он должен подчиняться политике того же происхождения.
параметры (необязательные) одна из его функций - указать имя рабочего процесса, чтобы различать несколько рабочих потоков.
рабочие свойства
Worker.onerror: указывает функцию прослушивания для события ошибки.
Worker.onmessage: определяет функцию прослушивания события сообщения, а отправляемые данные находятся в свойстве Event.data.
Worker.onmessageerror: определяет функцию прослушивания для события messageerror. Это событие запускается, когда отправленные данные не могут быть сериализованы в строку.
рабочий метод
Worker.postMessage(): отправить сообщение в рабочий поток.
Worker.terminate(): немедленно завершить рабочий поток.
Примечания по использованию воркеров
1. Гомологическая рестрикция
Файл сценария, назначенный рабочему потоку для запуска, должен иметь то же происхождение, что и файл сценария основного потока.
2. Ограничения DOM
Глобальный объект, в котором находится рабочий поток, отличается от основного потока, он не может читать DOM-объект веб-страницы, где находится основной поток, и не может использовать такие объекты, как документ, окно и родитель. Однако рабочие потоки могут перемещаться по объектам и объектам местоположения.
3. Общение
Рабочий поток и основной поток не находятся в одном и том же контексте, они не могут взаимодействовать напрямую и должны выполняться через сообщения.
4. Ограничения скрипта
Рабочие потоки не могут выполнять методы alert() и confirm(), но могут выполнять запросы AJAX, используя объект XMLHttpRequest.
5. Ограничения файлов
Рабочий поток не может читать локальные файлы, то есть он не может открывать локальную файловую систему (file://), а загружаемые им скрипты должны поступать из сети.
Давайте посмотрим на реальную колонку
Ни один рабочий не используется
Найдите 38-й член последовательности Фибоначчи.
<div style="width:100px;height:100px;background-color:red;"></div>
document.querySelector('div').onclick=function(){
console.log('hello world');
}
function fibonacci(n){
return n<2?n:arguments.callee(n-1)+arguments.callee(n-2);
}
console.log(fibonacci(38));
При использовании рабочего
<div style="width:100px;height:100px;background-color:red;"></div>
var worker=new Worker('worker.js');
worker.postMessage(40);
worker.onmessage=function(event){
var data=event.data;
console.log(data)
};
worker.onerror=function(event){
console.log(event.fileName,event.lineo,event.message);
};
<!--worker.js-->
self.onmessage = function (event) {
var data = event.data;
var ans = fibonacci(data);
this.postMessage(ans);
};
function fibonacci(n) {
return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2);
}
Друзья, у которых есть компьютер, могут скопировать приведенный выше код на компьютер, чтобы запустить, сравнить и увидеть эффект. Вы поймете роль этого работника.
То, что я записал здесь, может быть немного грубым, более подробно вы можете прочитать следующие статьи (конечно, я ссылаюсь на эти статьи)
Что, черт возьми, такое Web Worker?
Если письмо не очень хорошее, пожалуйста, попросите друзей оставить это в комментариях!