Slide 1

Slide 1 text

Modern concurrency Erlang, Scala, Go, Clojure, Haskell Алексей Качаев, 2013

Slide 2

Slide 2 text

Обо мне •CTO в Attendify.com •Erlang, Go, Clojure, Scala •СPython & Twitter Storm contributor •Автор библиотеки fn.py •Хобби: Haskell, Scheme, CRDT, системы типов, компиляторы

Slide 3

Slide 3 text

Искать •@kachayev •github: kachayev •kachayev@gmail.com

Slide 4

Slide 4 text

О чем? •Concurrency VS. parallelism •Задачи из теории и практики •Проблемы с OS threads & locks •MP VS. STM •Почему вдруг FP имеет значение?

Slide 5

Slide 5 text

Concurrency is not parallelism

Slide 6

Slide 6 text

© Rob Pike Concurrency is the composition of independently executing computations. Concurrency is a way to structure software...

Slide 7

Slide 7 text

Задачи •Ограниченные ресурсы, неограниченные потребности •Теория: “Спящий парикмахер” •Практика: Cache manager для листинга изображений

Slide 8

Slide 8 text

Use locks, Luke!

Slide 9

Slide 9 text

“Решение” •проверить ресурсы на диске •lock HM, проверить загружающих, unlock HM •HTTP HEAD + Content-Length •lock счетчик ресурсов, вычесть размер, unlock •HTTP body сбросить на диск

Slide 10

Slide 10 text

Да ну?

Slide 11

Slide 11 text

Решение?? •что делать с ошибками во время загрузки изображения? •что делать с “ожидающими” очистки свободного места •как насчет “10 x 1mb лучше чем 1 x 10mb”?

Slide 12

Slide 12 text

Решение?? •как “убить задачу”, если изображение уже не нужно? •что если нужно запустить 1000+ скачиваний одновременно? •вы уверены, что расставили locks правильно?

Slide 13

Slide 13 text

© Jonas Boner •Locks do not compose •Locks break encapsulation •Taking too few/many/wrong locks •Taking locks in wrong order •Error recovery is hard

Slide 14

Slide 14 text

Проблема •мир устроен по другому •ошибки в критической секции непоправимы •узнаете об ошибке в продакшине

Slide 15

Slide 15 text

Как жить дальше?

Slide 16

Slide 16 text

Задача Есть некий офис с сотней программистов, и доска с табличкой “задач сделано ...”. У каждого свои задачи. По выполнению нужно сделать +1. Как организовать работу?

Slide 17

Slide 17 text

Подходы •Message passing (обмен сообщениями) •STM (транзационная память) •Dataflow (потоковое управление)

Slide 18

Slide 18 text

Message passing Erlang, Scala, Go

Slide 19

Slide 19 text

Actor •изолированный легкий “процесс” •нет общей памяти •обмен сообщениями через mailbox •“location transparency”

Slide 20

Slide 20 text

Erlang

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

STM Clojure, Haskell

Slide 24

Slide 24 text

Память это база данных

Slide 25

Slide 25 text

Clojure •задумана “for concurrency” •Identity VS. Value •STM - синхронные и координированные изменения •Agents - асинхронные и независимые •Atom - синхронное изменение

Slide 26

Slide 26 text

Clojure

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

Dataflow Oz ~ Scala, Clojure, Haskell, ...

Slide 30

Slide 30 text

Dataflow Ваше домашнее задание :)

Slide 31

Slide 31 text

ФП •lambda calculus •side-effects free •детерминированные вычисления •immutable значения •бесмысленность “присваивания”

Slide 32

Slide 32 text

Ограничения Everything that can go wrong will go wrong © Murphy

Slide 33

Slide 33 text

Муки выбора •distribution → MP •некоординированное чтение → SMP •низкоуровневый код → locks

Slide 34

Slide 34 text

Муки выбора •никакой серебрянной пули •выбирайте идеоматичный подход •выбирайте идеоматичную технологию •зрите в корень

Slide 35

Slide 35 text

А также

Slide 36

Slide 36 text

СML

Slide 37

Slide 37 text

Go: channel •Тот же CSP •Транспортный слой •Грубая аналогия: имя файла VS. дескриптор файла •Еще одна: channel ≈ портабельный mailbox

Slide 38

Slide 38 text

Scala: Akka •библиотека Akka → core •очень (!) похоже на Erlang •сутью actor-а является состояние •yield-механизм намного слабее

Slide 39

Slide 39 text

А также... •Clojure core.async •CloudHaskell •Haxl •CRDT(s) •Bloom

Slide 40

Slide 40 text

Ссылки •Эта презентация: https:// speakerdeck.com/kachayev •Haskell: http://goo.gl/NxdDSv •Clojure: http://clojure.org/ •Go: http://golang.org/ •Scala: http://www.scala-lang.org/ •Erlang: http://www.erlang.org/