SlideShare a Scribd company logo
1 of 26
Download to read offline
Практическое применение
Web Workers
Алексей Фомкин
Data Monsters
Обзор Web Workers
● Позволяют выполнять код параллельно с
основным потоком выполнения
● Не разделяют память
● Не разделяют код
● Обмениваются сообщениями
● Доступны для 92% пользователей*
* http://caniuse.com/#search=webworkers на ноябрь 2016
Обзор Web Workers
● Нельзя манипулировать DOM
● Не доступен localStorage
● Не доступен window.location
Полный список того, что доступно, можно прочитать здесь
https://goo.gl/ogcuiX
Обзор Web Workers
● Сообщения сериализуются
● Можно передать владение ArrayBuffer и
ImageBitmap
Асинхронность
function foo(label) {
setTimeout(function() {
computeAndPrint(label, 1);
computeAndPrint(label, 2);
computeAndPrint(label, 3);
}, 0);
}
Асинхронность
foo('a');
foo('b');
Вывод
a 1
a 2
a 3
b 1
b 2
b 3
Параллелизм
function foo(label) {
computeAndPrint(label, 1);
computeAndPrint(label, 2);
computeAndPrint(label, 3);
}
Параллелизм
// Worker 1 code
foo('a');
// Worker 2 code
foo('b');
Вывод
a 1
b 1
a 2
b 2
b 3
a 3
Асинхронность и параллелизм
● Сообщения отправляются асинхронно
● Код выполняется параллельно
Асинхронность и параллелизм
onmessage = function(e) {
var messageId = e.data[0];
var messageBody = e.data[1];
var result = doSomething(messageBody);
postMessage([messageId, result]);
}
Асинхронность и параллелизм
function doInWorker(data) {
return new Promise(function(resolve, reject) {
var messageId = ++lastMessageId;
var onMessage = function(e) {
if (e.data[0] === messageId) {
resolve(e.data[1]);
worker.removeEventListener('message', onMessage);
}
};
worker.addEventListener('message', onMessage);
worker.postMessage([messageId, data]);
})
}
Применение: шифрование
● Храним приватные данные в localStorage
● Шифрование ресурсоемко
● Использовали
https://github.com/vibornoff/asmcrypto.js/
Применение: конвертация файлов
● Мобильное приложение (PhoneGap)
● Храним большие документы
● Работаем в оффлайне
● Конвертация занимает много времени
● Спасение в живительных воркерах
Применение: переносим в воркер вообще все
● Вся логика выполняется в воркере
● В основном потоке остается работа с DOM и
localStorage
● Страница никогда не подвисает
Применение: переносим в воркер вообще все
WebWorker
Transition
Render
State
Commands
DOM thread
Apply changes to
DOM
Listen events on
document.body
EventsServer push
Применение: переносим в воркер вообще все
Мои наработки по теме (Scala.js)
● https://github.com/tenderowls/moorka
● https://github.com/fomkin/korolev
● https://medium.com/@yelbota/-18195d44f574
Проблема: дублирование кода
● Своя “система модулей” importScript
● Ничего не знают про код, загруженный
через <script>
● Боль и страдание
Проблема: воркеры не бесплатны
● Воркер ― отдельный инстанс
виртуальной машины (в первом
приближении)
● Затраты на переключение контекста
● Затраты на запуск
Не создавайте тысячи воркеров.
Это вам не эрланг.
Проблема: сериализация
● Передавая сообщение, мы сначала
пишем его JSON, потом читаем (в
первом приближении)
● ArrayBuffer копируется, если мы не
указали, что он transferable.
Убедитесь, что вычисление
действительно тяжелое
Проблема: transferable взрывает мозг
var data = new ArrayBuffer(1024);
console.log(data);
// ArrayBuffer {byteLength: 1024}
postMessage(data, [data]);
console.log(data);
// null
Проблема: отсутствие тормозов
● Пользователь привык, что все
тормозит
● Программист привык, что страница
блокируется
Проблема: отсутствие тормозов
● Пользователь привык, что все
тормозит
● Программист привык, что страница
блокируется
Уведомите пользователя, что работа идет!
Вопросы?
Алексей Фомкин
Data Monsters
Телефон: +7 999 981 60 51
Почта: aleksey.fomkin@gmail.com
Twitter: @yelbota
GitHub: @fomkin
Telegram: @fomkin

More Related Content

What's hot

HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
Ontico
 
Инфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.jsИнфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.js
Stanislav Gumeniuk
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Ontico
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 

What's hot (20)

Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
 
Мониторь, автоматизируй Docker
Мониторь, автоматизируй DockerМониторь, автоматизируй Docker
Мониторь, автоматизируй Docker
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
Инфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.jsИнфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.js
 
Log+
Log+Log+
Log+
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
Benchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSDBenchmarking PostgreSQL in Linux and FreeBSD
Benchmarking PostgreSQL in Linux and FreeBSD
 
Python & Web: От простого к сложному
Python & Web: От простого к сложномуPython & Web: От простого к сложному
Python & Web: От простого к сложному
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
 
Use Grunt Luke
Use Grunt LukeUse Grunt Luke
Use Grunt Luke
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
 

Similar to Алексей Фомкин, Практическое применение Web Workers

специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)
Ontico
 
Архитектура растущего проекта, на примере ВКонтакте
Архитектура растущего проекта, на примере ВКонтактеАрхитектура растущего проекта, на примере ВКонтакте
Архитектура растущего проекта, на примере ВКонтакте
TKConf
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest
 

Similar to Алексей Фомкин, Практическое применение Web Workers (20)

Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)специализированные http-демона (Сергей Боченков, Александр Панков)
специализированные http-демона (Сергей Боченков, Александр Панков)
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Архитектура растущего проекта, на примере ВКонтакте
Архитектура растущего проекта, на примере ВКонтактеАрхитектура растущего проекта, на примере ВКонтакте
Архитектура растущего проекта, на примере ВКонтакте
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
Навигация в Android без боли и слез
Навигация в Android без боли и слезНавигация в Android без боли и слез
Навигация в Android без боли и слез
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Sivko
SivkoSivko
Sivko
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
Highload 2011-demona
Highload 2011-demonaHighload 2011-demona
Highload 2011-demona
 

Алексей Фомкин, Практическое применение Web Workers