6. Наивная многопоточность
> Answer: 753496416694282
> Has taken: 2101 ms
> Answer: 722347826057277
> Has taken: 2070 ms
> Answer: 717721376939013
> Has taken: 2116 ms
11. Вопросы по блокировкам
Как не допускать deadlock’ов?
Держать всю картину в голове?
Как эффективно утилизировать CPU?
Как тестировать?
Unit-тесты не очень подходят
Как отлаживать?
Дебаггеры рассчитаны на последовательное
выполнение программ
12. Альтернативные пути
Корень зла – shared mutable state
Знать инструмент
Volatile
Atomic
Lock-free data structures
…
Перейти на функциональное программирование
Отказ от shared mutable state
Использовать высокоуровневые фреймворки
Перенос shared mutable state вовне
14. Функциональное
программирование
Функции высших порядков
Функция может принимать к качестве аргумента
функцию
Функция может возвращать в качестве результата
функцию
«Чистые» функции, без побочных эффектов
Результат функции зависит только от входных
аргументов (referential transparency)
Неизменяемое состояние (immutable state)
Рекурсия как средство организации циклов
Монады
Продвинутая система типов
15. Пример ФП 1
> Answer: 4999999950000000
> Has taken: 2079 ms
17. Пример ФП 3
> Answer: 4999999950000000
> Has taken: 30 ms
18. Что дает ФП?
Модульность
Программа – это функция, состоящая из функций
Повторное использование
Части программы могут быть выделены и реорганизованы
Простота тестирования
Всегда детерминированный результат
Поддержка параллельности
Отсутствует shared mutable state
Счастье
Более предсказуемый результат
Меньше когнитивная нагрузка
Ограниченный простор для самореализации
19. Actor system
Акторы – это объекты, которые инкапсулируют
состояние и поведение. Они взаимодействуют
исключительно посредством обмена сообщениями.
20. Akka
Открытый фреймворк, в основе которого лежит
модель акторов (Jonas Bonér, 2009)
Модель акторов – высокоуровневая абстракция для
многопоточного программирования
Асинхронная высокопроизводительная event-driven
архитектура
Актор – «легковесный процесс» для обработки
событий
Иерархии супервизоров для гибкой обработки
ошибок и сбоев
21. Akka. Пример
case class Greeting(who: String)
class GreetingActor extends Actor with ActorLogging {
def receive = {
case Greeting(who) ⇒ log.info("Hello " + who)
}
}
val system = ActorSystem("MySystem")
val greeter = system.actorOf(Props[GreetingActor], name = "greeter")
greeter ! Greeting("Charlie Parker")