Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Конкурентное программирование на Scala

Покупка
Артикул: 767299.01.99
Доступ онлайн
679 ₽
В корзину
Scala - современный, мультипарадигменный язык программирования, позволяющий описывать типичные шаблоны программирования компактнее, выразительнее и безопаснее. Scala прекрасно сочетает в себе черты объектно-ориентированных и функциональных языков. Книга начинается с введения в основы конкурентного программирования в JVM и описания модели памяти в Java, а после демонстрирует основные строительные блоки для реализации конкурентных вычислений, такие как атомарные переменные, пулы потоков и конкурентные структуры данных. Затем рассматриваются разные высокоуровневые абстракции конкуренции, каждая из которых ориентирована на решение определенного класса задач, при этом затрагиваются самые последние достижения в поддержке асинхронного программирования. Также охватываются некоторые полезные шаблоны и способы использования описываемых приемов. В заключение дается краткий обзор применения разных библиотек поддержки конкуренции и демонстрируется возможность их совместного использования. Издание предназначено разработчикам с опытом программирования на Scala, но без опыта конкурентного и асинхронного программирования.
Прокопец, А. Конкурентное программирование на Scala : практическое пособие / А. Прокопец ; пер. с анг. А. Н. Киселева. - Москва : ДМК Пресс, 2018. - 342 с. - ISBN 978-5-97060-572-1. - Текст : электронный. - URL: https://znanium.com/catalog/product/1838846 (дата обращения: 28.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Александр Прокопец

Конкурентное  
программирование на Scala

Aleksandar Prokopec

Learning Concurrent 
Programming 
in Scala

Learn the art of building intricate, modern, scalable, 
and concurrent applications using Scala

BIRMINGHAM – MUMBAI

Александр Прокопец

Конкурентное  
программирование  
на Scala

Освойте искусство создания современных сложных, масштабируемых 
и конкурентных приложений на языке Scala

Москва, 2018

УДК 004.432.42Scala
ББК 32.973-018.1

П80

Прокопец А.

П80
Конкурентное программирование на Scala / пер. с анг. А. Н. Киселева. – М.: 
ДМК Пресс, 2018. – 342 с.: ил.

ISBN 978-5-97060-572-1

Scala – современный, мультипарадигменный язык программирования, позволяю
щий описывать типичные шаблоны программирования компактнее, выразительнее 
и безопаснее. Scala прекрасно сочетает в себе черты объектно-ориентированных 
и функциональных языков.

Книга начинается с введения в основы конкурентного программирования в JVM 

и описания модели памяти в Java, а после демонстрирует основные строительные блоки 
для реализации конкурентных вычислений, такие как атомарные переменные, пулы 
потоков и конкурентные структуры данных. Затем рассматриваются разные высокоуровневые абстракции конкуренции, каждая из которых ориентирована на решение 
определенного класса задач, при этом затрагиваются самые последние достижения 
в поддержке асинхронного программирования. Также охватываются некоторые полезные шаблоны и способы использования описываемых приемов. В заключение дается 
краткий обзор применения разных библиотек поддержки конкуренции и демонстрируется возможность их совместного использования.

Издание предназначено разработчикам с опытом программирования на Scala, но 

без опыта конкурентного и асинхронного программирования.

УДК 004.432.42Scala
ББК 32.973-018.1

Copyright © Packt Publishing 2017. First published in the English language under the title «Lear
ning Concurrent Programming in Scala – Second Edition – (9781786466891)».

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой 

бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

ISBN 978-1-78646-689-1 (анг.)
Copyright © 2017 Packt Publishing

ISBN 978-5-97060-572-1 (рус.)
© Оформление, издание, перевод, ДМК Пресс, 2018

Содержание

Предисловие .....................................................................................................................9
Об авторе .........................................................................................................................11
Благодарности ................................................................................................................12
О технических рецензентах .........................................................................................14
Вступление .......................................................................................................................17

Глава 1. Введение ...........................................................................................................25
Конкурентное программирование ..................................................................................25

Краткий обзор традиционных подходов к организации конкурентного  
выполнения ..................................................................................................................26
Современные парадигмы конкуренции .....................................................................27

Преимущества языка Scala...............................................................................................28
Начальные сведения .........................................................................................................29

Выполнение программ на Scala ..................................................................................30
Основы Scala .................................................................................................................31

Обзор новых особенностей в Scala 2.12 ..........................................................................35
В заключение ....................................................................................................................36
Упражнения.......................................................................................................................36

Глава 2. Конкуренция в JVM и модель памяти в Java .............................................38
Процессы и потоки ...........................................................................................................39

Создание и запуск потоков ..........................................................................................41
Атомарное выполнение ...............................................................................................45
Переупорядочение .......................................................................................................49

Мониторы и синхронизация ............................................................................................51

Взаимоблокировки .......................................................................................................53
Защищенные блокировки ............................................................................................55
Прерывание потоков и корректная остановка ...........................................................59

Изменчивые переменные ................................................................................................60
Модель памяти в Java .......................................................................................................62

Неизменяемые объекты и финальные поля ...............................................................64

В заключение ....................................................................................................................65
Упражнения.......................................................................................................................66

Глава 3. Традиционные строительные блоки конкурентных программ .............69
Объекты Executor и ExecutionContext .............................................................................70
Атомарные примитивы ....................................................................................................73

Атомарные переменные ..............................................................................................73
Неблокирующее программирование ..........................................................................76
Явная реализация блокировок ....................................................................................78
Проблема ABA ...............................................................................................................80

Ленивые значения ............................................................................................................82
Конкурентные коллекции ................................................................................................86

Конкурентные очереди ................................................................................................88
Конкурентные множества и словари ..........................................................................91
Конкурентные итерации ..............................................................................................95

 Содержание

Собственные конкурентные структуры данных ............................................................97

Реализация неблокирующего конкурентного пула ...................................................98
Создание и обработка процессов ..............................................................................102

В заключение ..................................................................................................................103
Упражнения.....................................................................................................................104

Глава 4. Асинхронное программирование с объектами Future и Promise .......107
Объекты Future ...............................................................................................................108

Запуск асинхронных вычислений .............................................................................109
Объекты Future и обратные вызовы .........................................................................111
Объекты Future и исключения ...................................................................................113
Использование типа Try .............................................................................................114
Фатальные исключения .............................................................................................115
Композиция функций в объектах Future ..................................................................116

Объекты Promise .............................................................................................................123

Преобразование программных интерфейсов на основе обратных вызовов .........125
Расширение программного интерфейса объектов Future .......................................127
Отмена асинхронных вычислений ...........................................................................128

Объекты Future и блокировка выполнения ..................................................................130

Ожидание завершения Future ...................................................................................130
Блокировка в асинхронных вычислениях ................................................................131

Библиотека Scala Async ..................................................................................................132
Альтернативные фреймворки асинхронных вычислений ..........................................134
В заключение  .................................................................................................................135
Упражнения.....................................................................................................................136

Глава 5. Параллельные коллекции данных ............................................................139
Краткий обзор коллекций в Scala ..................................................................................140
Использование параллельных коллекций ....................................................................140

Иерархия классов параллельных коллекций ............................................................144
Настройка уровня параллелизма ..............................................................................146
Измерение производительности в JVM ....................................................................146

Особенности параллельных коллекций ........................................................................149

Непараллелизуемые коллекции ................................................................................149
Непараллелизуемые операции ..................................................................................150
Побочные эффекты в параллельных операциях ......................................................152
Недетерминированные параллельные операции ....................................................153
Коммутативность и ассоциативность операторов ...................................................154

Совместное использование параллельных и конкурентных коллекций ...................155

Слабо согласованные итераторы ...............................................................................156

Реализация собственных параллельных коллекций ....................................................157

Сплиттеры ...................................................................................................................158
Комбинаторы ..............................................................................................................161

В заключение ..................................................................................................................163
Упражнения.....................................................................................................................164

Глава 6. Конкурентное программирование с Reactive Extensions .....................166
Создание объектов Observable .......................................................................................167

Объекты Observable и исключения ...........................................................................169
Контракт наблюдаемого объекта ..............................................................................170
Реализация собственных объектов Observable ........................................................172

Содержание  7

Создание наблюдаемых объектов из объектов Future .............................................173
Подписки .....................................................................................................................174

Объединение объектов Observable ................................................................................176

Вложенные наблюдаемые объекты ...........................................................................178
Обработка ошибок в наблюдаемых объектах ...........................................................182

Планировщики Rx ...........................................................................................................184

Использование собственных планировщиков в приложениях  
с графическим интерфейсом .....................................................................................185

Субъекты и реактивное программирование сверху вниз ............................................190
В заключение ..................................................................................................................194
Упражнения.....................................................................................................................194

Глава 7. Программная транзакционная память ......................................................197
Недостатки атомарных переменных ............................................................................198
Использование программной транзакционной памяти .............................................201

Транзакционные ссылки............................................................................................204
Использование инструкции atomic ...........................................................................205

Комбинирование транзакций ........................................................................................206

Взаимодействие транзакций и побочные эффекты ................................................206
Транзакции с одной операцией ................................................................................210
Вложенные транзакции .............................................................................................211
Транзакции и исключения .........................................................................................214

Повторение транзакций .................................................................................................218

Повторения с тайм-аутами ........................................................................................221

Транзакционные коллекции ..........................................................................................222

Локальные переменные транзакций ........................................................................222
Транзакционные массивы .........................................................................................224
Транзакционные словари ..........................................................................................225

В заключение ..................................................................................................................226
Упражнения.....................................................................................................................227

Глава 8. Акторы .............................................................................................................230
Работа с акторами ...........................................................................................................231

Создание экземпляров и систем акторов .................................................................233
Управление необработанными сообщениями .........................................................236
Поведение и состояние актора ..................................................................................237
Иерархии акторов в Akka ...........................................................................................241
Идентификация акторов............................................................................................244
Жизненный цикл акторов .........................................................................................246

Взаимодействия между акторами .................................................................................249

Шаблон «запрос».........................................................................................................251
Шаблон «пересылка» ..................................................................................................253
Остановка акторов .....................................................................................................254

Диспетчеризация акторов .............................................................................................255
Удаленные акторы ..........................................................................................................260
В заключение ..................................................................................................................263
Упражнения.....................................................................................................................264

Глава 9. Конкуренция на практике ...........................................................................266
Выбор правильных инструментов для решения конкретных задач ...........................266
Объединяем все вместе – сетевой браузер файлов ......................................................270

 Содержание

Моделирование файловой системы ..........................................................................272
Интерфейс связи с сервером .....................................................................................275
Программный интерфейс навигации на стороне клиента .....................................276
Пользовательский интерфейс на стороне клиента ..................................................279
Реализация логики клиента.......................................................................................282
Усовершенствование сетевого браузера файлов .....................................................286

Отладка конкурентных программ .................................................................................287

Взаимоблокировки и отсутствие прогресса .............................................................288
Отладка ошибочных результатов ..............................................................................292
Отладка производительности ...................................................................................296

В заключение ..................................................................................................................302
Упражнения.....................................................................................................................303

Глава 10. Реакторы .......................................................................................................305
Необходимость реакторов .............................................................................................306
Введение в фреймворк Reactors ....................................................................................307
Программа «Hello World» ...............................................................................................308
Потоки событий ..............................................................................................................309

Жизненный цикл потока событий ............................................................................310
Комбинирование потоков событий ..........................................................................311

Реакторы..........................................................................................................................313

Определение и настройка реакторов ........................................................................314
Использование каналов .............................................................................................315

Планировщики ................................................................................................................317
Жизненный цикл реактора ............................................................................................319
Службы системы реакторов ...........................................................................................320

Служба журналирования ...........................................................................................321
Служба времени..........................................................................................................321
Служба каналов ..........................................................................................................322
Пользовательские службы .........................................................................................323

Протоколы .......................................................................................................................325

Собственная реализация протокола клиент-сервер ................................................325
Стандартный протокол сервер-клиент .....................................................................327
Протокол маршрутизации .........................................................................................330
Протокол двустороннего обмена ..............................................................................331

В заключение ..................................................................................................................334
Упражнения.....................................................................................................................335

Предисловие

Конкурентное и параллельное программирование постепенно превращается из 
узкоспециализированной дисциплины, интересной только специалистам, занимающимся разработкой ядра операционной системы или высокопроизводительными вычислениями, в комплекс знаний, которыми должен обладать каждый 
профессиональный программист. По мере превращения параллельных и распределенных вычислений в норму большинство приложений будет создаваться конкурентными – для увеличения производительности или обработки асинхронных 
событий.
Но пока большинство разработчиков не готово к этой революции. Возможно, 
уже давно они изучали традиционную модель параллельных вычислений, основанную на потоках и блокировках, но эта модель не способна обеспечить высокую 
надежность и приемлемую производительность в приложениях с массовым параллелизмом. В действительности потоки и блокировки сложны в использовании, 
а пользоваться ими правильно еще сложнее. Чтобы добиться успеха, необходимо 
использовать абстракции конкурентного выполнения, находящиеся на более высоком уровне и допускающие объединение.
15 лет назад я работал над предшественником Scala – экспериментальным языком Funnel со встроенной семантикой конкуренции. Все понятия программирования были реализованы в этом языке как синтаксический сахар поверх функциональных сетей, объектно-ориентированного варианта исчисления соединений 
процессов (join calculus). Даже притом, что исчисление соединений процессов 
считается замечательной теорией, после нескольких экспериментов мы поняли, 
что проблема конкуренции более многогранна, из-за чего ее трудно выразить 
единственной формулировкой. Нет общего рецепта, решающего все проблемы 
конкуренции; правильное решение во многом зависит от конечной цели. Хотите 
реализовать асинхронные вычисления, запускаемые в ответ на события или при 
получении потоков значений? Или получить автономные объекты, изолированные сущности, взаимодействующие друг с другом посредством сообщений? Или 
определить транзакции поверх изменяемого хранилища? Или, может быть, главной целью организации параллельных вычислений является увеличение производительности? Для каждой из этих задач существует своя абстракция, решающая 
свои проблемы: отложенные вычисления, реактивные потоки данных, акторы, 
транзакционная память или коллекции с поддержкой параллельных операций.
Это привело нас к языку Scala и к данной книге. Из-за большого количества полезных абстракций конкуренции идея встроить их все в язык программирования 
не показалась нам захватывающей. Главной целью создания Scala было упрощение 
определения высокоуровневых абстракций в пользовательском коде и библиотеках. Благодаря этому любой сможет определять модули, реализующие разные 
аспекты конкурентного программирования. Все эти модули могут быть основаны на низкоуровневых примитивах, предоставляемых операционной системой. 
По прошествии времени можно уверенно сказать, что этот подход оправдал себя. 
Современный язык Scala имеет несколько мощных и элегантных библиотек для 

 Предисловие

конкурентного программирования. Эта книга познакомит вас с некоторыми из 
них, объяснит область применения каждой и представит прикладные шаблоны.
Трудно найти более авторитетного специалиста, чем автор этой книги. Александр Прокопец (Aleksandar Prokopec) участвовал в развитии нескольких наиболее популярных библиотек поддержки конкурентного и параллельного программирования в Scala. Он также предложил некоторые из особенно сложных 
структур данных и алгоритмов. В лице этой книги он создал простое и понятное 
руководство и одновременно надежный справочник для области, в которой он 
работает. Я уверен, что книгу «Конкурентное программирование на Scala» должен прочитать каждый, кто пишет конкурентные и параллельные программы на 
Scala. Я также предполагаю, что она заинтересует всех, кто просто желает узнать 
больше об этой интереснейшей и быстро развивающейся области компьютерных 
вычислений.
Мартин Одерски (Martin Odersky),
профессор федеральной  
политехнической школы Лозанны (EPFL),  
создатель Scala

Доступ онлайн
679 ₽
В корзину