Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Concurrency, Message Passing & STM [rus]
Search
Oleksii Kachaiev
November 07, 2013
Programming
470
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Concurrency, Message Passing & STM [rus]
Lecture for KPI students [russian language]
Oleksii Kachaiev
November 07, 2013
More Decks by Oleksii Kachaiev
See All by Oleksii Kachaiev
Counting HTTP with QUIC & HTTP/3
kachayev
2
340
Talking SQL to Strangers
kachayev
3
650
Counting HTTP: 0.9...3
kachayev
1
150
Managing Data Chaos in The World of Microservices
kachayev
3
730
Deep HTTP Dive Through Aleph & Netty
kachayev
6
4.1k
Keep Your Data Safe With Refined Types
kachayev
4
1.6k
Clojure at Attendify (2nd ed)
kachayev
5
1.7k
Clojure at Attendify
kachayev
4
410
Finagle & Clojure
kachayev
6
1.4k
Other Decks in Programming
See All in Programming
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
1.1k
Simple Storage Service(S3) is not simple
iwatsukayura
0
330
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
200
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.3k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
460
残高管理から台帳サービスへの進化
artoy
1
210
Event is what happens
moro
2
1.6k
続・コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions-again
handlename
0
120
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
840
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
150
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
370
パスワード再設定メールのURLについて知っておこう
uyuki234
0
190
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
290
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
A Soul's Torment
seathinner
8
3.8k
Navigating Team Friction
lara
192
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Designing for Performance
lara
612
70k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Bash Introduction
62gerente
615
220k
Transcript
Modern concurrency Erlang, Scala, Go, Clojure, Haskell Алексей Качаев, 2013
Обо мне •CTO в Attendify.com •Erlang, Go, Clojure, Scala •СPython
& Twitter Storm contributor •Автор библиотеки fn.py •Хобби: Haskell, Scheme, CRDT, системы типов, компиляторы
Искать •@kachayev •github: kachayev •
[email protected]
О чем? •Concurrency VS. parallelism •Задачи из теории и практики
•Проблемы с OS threads & locks •MP VS. STM •Почему вдруг FP имеет значение?
Concurrency is not parallelism
© Rob Pike Concurrency is the composition of independently executing
computations. Concurrency is a way to structure software...
Задачи •Ограниченные ресурсы, неограниченные потребности •Теория: “Спящий парикмахер” •Практика: Cache
manager для листинга изображений
Use locks, Luke!
“Решение” •проверить ресурсы на диске •lock HM, проверить загружающих, unlock
HM •HTTP HEAD + Content-Length •lock счетчик ресурсов, вычесть размер, unlock •HTTP body сбросить на диск
Да ну?
Решение?? •что делать с ошибками во время загрузки изображения? •что
делать с “ожидающими” очистки свободного места •как насчет “10 x 1mb лучше чем 1 x 10mb”?
Решение?? •как “убить задачу”, если изображение уже не нужно? •что
если нужно запустить 1000+ скачиваний одновременно? •вы уверены, что расставили locks правильно?
© Jonas Boner •Locks do not compose •Locks break encapsulation
•Taking too few/many/wrong locks •Taking locks in wrong order •Error recovery is hard
Проблема •мир устроен по другому •ошибки в критической секции непоправимы
•узнаете об ошибке в продакшине
Как жить дальше?
Задача Есть некий офис с сотней программистов, и доска с
табличкой “задач сделано ...”. У каждого свои задачи. По выполнению нужно сделать +1. Как организовать работу?
Подходы •Message passing (обмен сообщениями) •STM (транзационная память) •Dataflow (потоковое
управление)
Message passing Erlang, Scala, Go
Actor •изолированный легкий “процесс” •нет общей памяти •обмен сообщениями через
mailbox •“location transparency”
Erlang
None
None
STM Clojure, Haskell
Память это база данных
Clojure •задумана “for concurrency” •Identity VS. Value •STM - синхронные
и координированные изменения •Agents - асинхронные и независимые •Atom - синхронное изменение
Clojure
None
None
Dataflow Oz ~ Scala, Clojure, Haskell, ...
Dataflow Ваше домашнее задание :)
ФП •lambda calculus •side-effects free •детерминированные вычисления •immutable значения •бесмысленность
“присваивания”
Ограничения Everything that can go wrong will go wrong ©
Murphy
Муки выбора •distribution → MP •некоординированное чтение → SMP •низкоуровневый
код → locks
Муки выбора •никакой серебрянной пули •выбирайте идеоматичный подход •выбирайте идеоматичную
технологию •зрите в корень
А также
СML
Go: channel •Тот же CSP •Транспортный слой •Грубая аналогия: имя
файла VS. дескриптор файла •Еще одна: channel ≈ портабельный mailbox
Scala: Akka •библиотека Akka → core •очень (!) похоже на
Erlang •сутью actor-а является состояние •yield-механизм намного слабее
А также... •Clojure core.async •CloudHaskell •Haxl •CRDT(s) •Bloom
Ссылки •Эта презентация: 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/