Table Of ContentТомас Хантер II, Брайан Инглиш
Многопоточный JavaScript
Multithreaded
JavaScript
Concurrency Beyond the Event Loop
Thomas Hunter II and Bryan English
Beijing • Boston • Farnham • Sebastopol • Tokyo
Многопоточный
JavaScript
Конкурентность за пределами цикла событий
Томас Хантер II, Брайан Инглиш
Москва, 2022
УДК 004.42
ББК 32.972
Х19
Хантер II Т., Инглиш Б.
Х19 Многопоточный JavaScript / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс,
2022. – 188 с.: ил.
ISBN 978-5-93700-129-0
Цель данной книги – научить читателя нескольким аспектам написания много-
поточных JavaScript-приложений. Прочитав книгу до конца, вы будете понимать
различные API веб-исполнителей в браузерах, их сильные и слабые стороны
и когда какой использовать. Также узнаете о модуле рабочих потоков в Node.js
и сможете сравнить его API с тем, что имеется в браузере.
Издание предназначено в первую очередь разработчикам, уже знакомым
с JavaScript, но мало знакомым с многопоточным программированием.
УДК 004.42
ББК 32.972
Authorized Russian translation of the English edition of Multithreaded JavaScript ISBN
9781098104436. Copyright © 2022 Thomas Hunter II and Bryan English.
Все права защищены. Любая часть этой книги не может быть воспроизведена в ка-
кой бы то ни было форме и какими бы то ни было средствами без письменного разрешения
владельцев авторских прав.
ISBN 978-1-098-10443-6 (англ.) © T homas Hunter II
and Bryan English, 2022
ISBN 978-5-93700-129-0 (рус.) © П еревод, оформление, издание,
ДМК Пресс, 2022
Посвящается Кэтлин и Ренье
Содержание
От издательства ......................................................................................................9
Вступительное слово .........................................................................................10
Предисловие ..........................................................................................................12
Об авторах ..............................................................................................................16
Об иллюстрации на обложке .........................................................................17
Глава 1. Введение ................................................................................................18
Что такое потоки? ......................................................................................................20
Конкурентность и параллелизм ...............................................................................21
Однопоточный Java Script ..........................................................................................23
Скрытые потоки .........................................................................................................25
Потоки на C: обогатитесь с помощью криптовалюты Happycoin .......................27
С одним главным потоком ...................................................................................27
С четырьмя рабочими потоками .........................................................................30
Глава 2. Браузеры ................................................................................................34
Выделенные исполнители ........................................................................................34
Выделенный исполнитель Hello World ...............................................................35
Продвинутое использование выделенного исполнителя ................................38
Разделяемые исполнители .......................................................................................39
Разделяемый исполнитель Hello World ..............................................................41
Продвинутое использование разделяемого исполнителя ..............................45
Сервисные исполнители ...........................................................................................47
Сервисный исполнитель Hello World ..................................................................48
Продвинутые возможности сервисных исполнителей ....................................53
Абстракции передачи сообщений ...........................................................................55
Паттерн RPC ............................................................................................................56
Паттерн Диспетчер команд ..................................................................................57
Соберем все вместе ................................................................................................59
Глава 3. Node.js .....................................................................................................65
Что было до потоков ..................................................................................................66
Модуль worker_threads ...............................................................................................68
workerData ...............................................................................................................69
MessagePort .............................................................................................................69
И снова Happycoin ......................................................................................................71
С одним главным потоком ...................................................................................72
Содержание 7
С четырьмя потоками ...........................................................................................74
Piscina – организация пула рабочих потоков ........................................................75
Полный пул Happycoin’ов .........................................................................................79
Глава 4. Разделяемая память ........................................................................82
Введение в разделяемую память .............................................................................82
Разделяемая память в браузере ...........................................................................83
Разделяемая память в Node.js ..............................................................................85
SharedArrayBuffer и типизированные массивы .....................................................87
Атомарные методы манипулирования данными .................................................92
Atomics.add() ...........................................................................................................92
Atomics.and() ...........................................................................................................93
Atomics.compareExchange() ..................................................................................93
Atomics.exchange() .................................................................................................93
Atomics.isLockFree() ...............................................................................................93
Atomics.load() ..........................................................................................................94
Atomics.or() .............................................................................................................94
Atomics.store() ........................................................................................................94
Atomics.sub() ...........................................................................................................94
Atomics.xor()............................................................................................................95
Несколько замечаний об атомарности ...................................................................95
Сериализация данных ...............................................................................................98
Булевы значения ....................................................................................................98
Строки .....................................................................................................................99
Объекты .................................................................................................................101
Глава 5. Дополнительные способы работы с разделяемой
памятью ..................................................................................................................102
Атомарные методы координации .........................................................................102
Atomics.wait() ........................................................................................................103
Atomics.notify() .....................................................................................................104
Atomics.waitAsync() ..............................................................................................105
Хронометраж и недетерминированность ............................................................105
Пример недетерминированности .....................................................................105
Определение готовности потока .......................................................................108
Пример приложения: игра «Жизнь» Конвея ........................................................110
Однопоточная игра «Жизнь» .............................................................................111
Многопоточная игра «Жизнь» ...........................................................................114
Атомарные операции и события ...........................................................................121
Глава 6. Паттерны многопоточного программирования ..............123
Пул потоков ...............................................................................................................123
Размер пула...........................................................................................................124
Стратегии диспетчеризации ..............................................................................125
Пример реализации ............................................................................................127
Мьютекс: простая блокировка ...............................................................................132
8 Содержание
Потоковая обработка данных с помощью кольцевых буферов ........................137
Модель акторов ........................................................................................................144
Нюансы паттерна .................................................................................................144
Акторы в JavaS cript ..............................................................................................145
Пример реализации ............................................................................................146
Глава 7. WebAssembly.......................................................................................153
Ваша первая WebAssembly ......................................................................................153
Атомарные операции в WebAssembly ...................................................................155
Компиляция с C на WebAssembly с помощью Emscripten ..................................156
Другие компиляторы на WebAssembly .................................................................158
AssemblyScript ...........................................................................................................159
Happycoin на AssemblyScript ...................................................................................160
Глава 8. Анализ ....................................................................................................165
Когда не стоит использовать потоки.....................................................................165
Ограничения на объем памяти ..........................................................................166
Недостаточное число ядер .................................................................................168
Контейнеры и потоки ..........................................................................................171
Когда стоит использовать потоки ..........................................................................171
Подводные камни ....................................................................................................176
Приложение. Алгоритм структурированного клонирования ......178
Предметный указатель ...................................................................................181
От издательства
Отзывы и пожелания
Мы всегда рады отзывам наших читателей. Расскажите нам, что вы ду маете
об этой книге, – что понравилось или, может быть, не понравилось. Отзывы
важны для нас, чтобы выпускать книги, которые будут для вас максимально
полезны.
Вы можете написать отзыв на нашем сайте www.dmkpress.com, зайдя на
страницу книги и оставив комментарий в разделе «Отзывы и рецензии».
Также можно послать письмо главному редактору по адресу dmkpress@gmail.
com; при этом укажите название книги в теме письма.
Если вы являетесь экспертом в какой-либо области и заинтересованы в на-
писании новой книги, заполните форму на нашем сайте по адресу http://
dmkpress.com/authors/publish_book/ или напишите в издательство по адресу
[email protected].
Список опечаток
Хотя мы приняли все возможные меры для того, чтобы обеспечить высо-
кое качество наших текстов, ошибки все равно случаются. Если вы найдете
ошибку в одной из наших книг, мы будем очень благодарны, если вы сооб-
щите о ней главному редактору по адресу [email protected]. Сделав это,
вы избавите других читателей от недопонимания и поможете нам улучшить
последующие издания этой книги.
Нарушение авторских прав
Пиратство в интернете по-прежнему остается насущной проблемой. Издатель-
ства «ДМК Пресс» и O’Reilly очень серьезно относятся к вопросам защиты ав-
торских прав и лицензирования. Если вы столкнетесь в интернете с незаконной
публикацией какой-либо из наших книг, пожалуйста, пришлите нам ссылку на
интернет-ресурс, чтобы мы могли применить санкции.
Ссылку на подозрительные материалы можно прислать по адресу элект-
ронной почты [email protected].
Мы высоко ценим любую помощь по защите наших авторов, благодаря
которой мы можем предоставлять вам качественные материалы.