SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
Григорий Фёдоров
Android разработчик
Опыт использования
в боевом проекте
Каналы в корутинах
31 июля 2019
1
Котлин, корутины, каналы
Первый коммит с корутинами 11 ноября 2018
В разработке ещё один проект на корутинах
Маруся
2
fun main() {
GlobalScope. launch {
delay(1000L)
println("World!")
}
println("Hello,")
Thread.sleep(2000L)
}
Что такое корутины
3
• “О, клево! Наверное, будет очень классно!”
• “Залезаешь в новую технологию и просто собираешь камни лицом”
• “Баги в самих корутинах и непонятно, бага или фича”
• “Нереально сложно. Просто дико сложно. Не лежит рядом по
сравнению с эрикс-фигикс”
Впечатления команды
4
• “API корутин содержит сложности, но с ними меньше проблем, чем с
традиционными подходами к многопоточности”
• “Подход со structured concurrency упрощает жизнь, в частности Android-
разработчикам”
• “API охренительное очень мощное, поэтому сложное”
• “Нет колбэк хэла, просто, быстро. Гораздо удобнее, чем экзекьюторы”
Впечатления команды
5
• Круто, но есть подводные камни
• Обработка ошибок
• Скоупы
• Баги в самих корутинах
• В простые проекты заходит легко
Впечатления команды
6
Переходим
к каналам
7
• Последовательная обработка поступающих данных
• В разных потоках, несколькими потребителями
• Например:
○ аудио данные от микрофона
○ event loop
○ очередь команд
Какую проблему решаем
8
• Сервер управляет приложением
• Приложение реализует набор команд:
○ Проиграть звук
○ Показать текст, картинку и т.д.
○ Запустить запись звука
○ И другие
• Можно внедрять новые фичи на бэкенде
Очередь команд в Марусе
9
• RxJava
• LiveData
• Очереди
Альтернативы
10
Несмотря на экспериментальный статус
• Альтернативы не знают о корутинах
• Потоки != корутины
• Своё писать дорого
Почему каналы
11
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
}
repeat(5) { println(channel.receive()) }
println("Done!")
Что такое каналы
12
• Передача данных между корутинами
• Примитив синхронизации
• Потокобезопасная очередь
• Горячий источник данных
Что такое каналы
13
• Сommunicating sequential processes, CSP
• Избегаем разделяемой памяти
• Иммутабельные данные
Взаимодействующие
последовательные процессы
14
Как устроены каналы
• Несут затраты на синхронизацию
• Никита Коваль — Как устроены каналы в корутинах в Kotlin
https://www.youtube.com/watch?v=XHMXyYlQ8Eg
15
• Какой тип канала выбрать?
○ Channel
■ рандеву
■ буфер
■ связный список
■ conflated
○ Broadcast
○ ConflatedBroadcast
• Аналоги для subject из RxJava
Сложности
16
• Подписаться на канал и не закрыть его
Неправильное использование
val channel = Channel<String>(1)
GlobalScope.launch {
channel.consumeEach { println("Consumer: $it") }
println("Consumer finished")
}
GlobalScope.launch {
channel.send("Data")
// channel.close()
println("Producer finished")
}
17
• Открыть подписку и не потреблять данные
Неправильное использование
val broadcast = BroadcastChannel<String>(1)
GlobalScope.launch {
val receive : ReceiveChannel<String> = broadcast.openSubscription()
// receive.consumeEach { println("Consumer: $it") }
println("Consumer finished")
}
GlobalScope.launch {
delay(500)
broadcast.send( "Data1")
broadcast.send( "Data2")
broadcast.close()
println("Producer finished")
}
18
Неправильное использование
val broadcast = BroadcastChannel<Recorder.RecordData>( BUFFER_CAPACITY)
while (recorder.isInRecordingState()) {
val recordData = recorder.readNext()
broadcast.send(recordData)
// val success = broadcast.offer(recordData)
// if (!success) {
// // ...
// }
}
• Не учитывать возможное переполнение
19
Неправильное использование
• Использование там, где нет необходимости
private val channel = BroadcastChannel<ActivityResult>( 1)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
super.onActivityResult(requestCode, resultCode, data)
channel.offer(ActivityResult(requestCode, resultCode))
}
class FragmentViewModel( private val channel: BroadcastChannel<ActivityResult>)
: ViewModelScope() {
fun listenResult() {
launch {channel.consumeEach { /* process result */ } }
}
}
20
• Обработка “горячего” потока данных: микрофон, входящее сетевое
соединение и т.д.
• Сведение нескольких потоков данных в один
• Безопасная работа с состоянием
Правильное использование
21
• Были, но deprecated
• Были не все, приходилось писать самим
Операторы
22
DistinctUntilChanged
23
@UseExperimental(InternalCoroutinesApi::class)
fun <E> ReceiveChannel<E>.distinctUntilChanged(
context: CoroutineContext = Dispatchers.Unconfined
) = GlobalScope.produce(context = context, onCompletion = consumes()) {
var last: E? = null
var isFirstEmmit = true
for (next in this@distinctUntilChanged) {
if (isFirstEmmit || last != next) {
isFirstEmmit = false
last = next
send(next)
}
}
}
DistinctUntilChanged
24
DistinctUntilChanged
channel.openSubscription()
.distinctUntilChanged()
.consumeEach { println("consume $it")}
consume one
consume two
consume one
val channel = BroadcastChannel<String>(1)
launch { with(channel) {
repeat(3) { send("one") }
repeat(2) { send("two") }
repeat(5) { send("one") }
} }
25
CombineLatest
26
• Модель акторов
• Актор:
○ корутина
○ состояние
○ “почтовый ящик”
Actor
27
Actor
val c = actor {
// initialize actor's state
for (msg in channel) {
// process message here
}
}
// send messages to the actor
c.send(...)
...
// stop the actor when it is no longer needed
c.close()
28
CombineLatest
fun <F, S, R> ReceiveChannel< F>.combineLatest(
other: ReceiveChannel< S>, context: CoroutineContext = Dispatchers. Unconfined,
transform: (a: F, b: S) -> R): ReceiveChannel< R> {
class StatePart(val argNum: Int, val arg1: F?, val arg2: S?)
return GlobalScope. produce(context, onCompletion = consumesAll(this, other)) {
val actor = actor<StatePart> {
var first: F? = null; var second: S? = null
var isFirstSet = false; var isSecondSet = false
for (next in this) {
if (next.argNum == 1) { isFirstSet = true; first = next. arg1 }
else { isSecondSet = true; second = next. arg2 }
if (isFirstSet && isSecondSet) {
@Suppress("UNCHECKED_CAST")
send(transform(first as F, second as S))
}
}
}
launch { this@combineLatest .consumeEach { value -> actor.send(StatePart( 1, value, null)) } }
launch { other.consumeEach { value -> actor.send(StatePart( 2, null, value)) } }
}
} 29
30
val intCh = BroadcastChannel<Int>(1); val strCh = BroadcastChannel<String>(1)
launch {
intCh.send(1)
intCh.send(2)
strCh.send("A")
intCh.send(3)
strCh.send("B")
intCh.send(4)
strCh.send("C")
strCh.send("D")
intCh.send(5)
}
intCh.openSubscription()
.combineLatest(strCh.openSubscription(),
transform = { a, b -> "$a$b" })
.consumeEach { println("consume $it") }
consume 2A
consume 3A
consume 3B
consume 4B
consume 4C
consume 4D
consume 5D
31
• Холодные потоки
• Без синхронизации
• Операторы
• Альтернатива Rx
Flow
32
DistinctUntilChanged — Flow
channel.openSubscription()
.distinctUntilChanged()
.consumeEach { println("consume $it")}
consume one
consume two
consume one
val channel = BroadcastChannel<String>(1)
launch { with(channel) {
repeat(3) { send("one") }
repeat(2) { send("two") }
repeat(5) { send("one") }
} }
channel.asFlow()
.distinctUntilChanged()
.collect { println("collect $it")}
collect one
collect two
collect one
33
val intCh = BroadcastChannel<Int>(1); val strCh = BroadcastChannel<String>(1)
launch {
intCh.send(1)
intCh.send(2)
strCh.send("A")
intCh.send(3)
strCh.send("B")
intCh.send(4)
strCh.send("C")
strCh.send("D")
intCh.send(5)
}
intCh.openSubscription()
.combineLatest(strCh.openSubscription(),
transform = { a, b -> "$a$b" })
.consumeEach { println("consume $it") }
consume 2A
consume 3A
consume 3B
consume 4B
consume 4C
consume 4D
consume 5D
intCh.asFlow()
.combineLatest(strCh.asFlow(), { a, b ->
"$a$b" })
.collect { println("collect $it") }
collect 1A
collect 2A
collect 3A
collect 3B
collect 4B
collect 4C
collect 4D
collect 5D 34
• Блог Романа Елизарова medium.com/@elizarov
• kotlinlang.org
• github.com/Kotlin/kotlinx.coroutines
Что читать
35
• Корутины:
○ Лаконичный код без коллбэк хелла
○ Мощный механизм областей видимости
○ Сложность, неочевидные моменты, другая парадигма
• Каналы:
○ Область применения ограничена — горячий источник
○ Примитив синхронизации
○ Также есть сложности и неочевидные моменты
○ Экспериментальны?
○ Следить за Flow
Резюме
36
• Кирилл Филимонов
• Александр Шаталов
• Владимир Ширяев
• Александр Королёв
• Виктор Филлипов
• Рустам Ситдиков
Благодарности
37
Григорий
Фёдоров
Android разработчик
t.me/grigoryfedorov
g.fedorov@corp.mail.ru
38
39

Contenu connexe

Tendances

"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)""Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"Artjoker
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновYandex
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после JavaKirill Rozov
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaOlim Saidov
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновYandex
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package managercorehard_by
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуCEE-SEC(R)
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?Kirill Rozov
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Teach your dockers to use CRanes
Teach your dockers to use CRanesTeach your dockers to use CRanes
Teach your dockers to use CRanesPavel Emelyanov
 

Tendances (20)

"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)""Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
 
Cloud Haskell. Александр Вершилов
Cloud Haskell. Александр ВершиловCloud Haskell. Александр Вершилов
Cloud Haskell. Александр Вершилов
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другу
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
Teach your dockers to use CRanes
Teach your dockers to use CRanesTeach your dockers to use CRanes
Teach your dockers to use CRanes
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
 

Similaire à «Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров

Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?UNETA
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019Mail.ru Group
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpiMichael Karpov
 

Similaire à «Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров (20)

Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Windows 10 SDK
Windows 10 SDKWindows 10 SDK
Windows 10 SDK
 
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?
Uneta 17.04.15 Bondarenko - What's NEW in Windows 10 SDK?
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
JavaScript Intro
JavaScript IntroJavaScript Intro
JavaScript Intro
 
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019AIDL в современном мире, Виктор Лапин. 8 июня, 2019
AIDL в современном мире, Виктор Лапин. 8 июня, 2019
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi
 

Plus de Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

Plus de Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров

  • 1. Григорий Фёдоров Android разработчик Опыт использования в боевом проекте Каналы в корутинах 31 июля 2019 1
  • 2. Котлин, корутины, каналы Первый коммит с корутинами 11 ноября 2018 В разработке ещё один проект на корутинах Маруся 2
  • 3. fun main() { GlobalScope. launch { delay(1000L) println("World!") } println("Hello,") Thread.sleep(2000L) } Что такое корутины 3
  • 4. • “О, клево! Наверное, будет очень классно!” • “Залезаешь в новую технологию и просто собираешь камни лицом” • “Баги в самих корутинах и непонятно, бага или фича” • “Нереально сложно. Просто дико сложно. Не лежит рядом по сравнению с эрикс-фигикс” Впечатления команды 4
  • 5. • “API корутин содержит сложности, но с ними меньше проблем, чем с традиционными подходами к многопоточности” • “Подход со structured concurrency упрощает жизнь, в частности Android- разработчикам” • “API охренительное очень мощное, поэтому сложное” • “Нет колбэк хэла, просто, быстро. Гораздо удобнее, чем экзекьюторы” Впечатления команды 5
  • 6. • Круто, но есть подводные камни • Обработка ошибок • Скоупы • Баги в самих корутинах • В простые проекты заходит легко Впечатления команды 6
  • 8. • Последовательная обработка поступающих данных • В разных потоках, несколькими потребителями • Например: ○ аудио данные от микрофона ○ event loop ○ очередь команд Какую проблему решаем 8
  • 9. • Сервер управляет приложением • Приложение реализует набор команд: ○ Проиграть звук ○ Показать текст, картинку и т.д. ○ Запустить запись звука ○ И другие • Можно внедрять новые фичи на бэкенде Очередь команд в Марусе 9
  • 10. • RxJava • LiveData • Очереди Альтернативы 10
  • 11. Несмотря на экспериментальный статус • Альтернативы не знают о корутинах • Потоки != корутины • Своё писать дорого Почему каналы 11
  • 12. val channel = Channel<Int>() launch { for (x in 1..5) channel.send(x * x) } repeat(5) { println(channel.receive()) } println("Done!") Что такое каналы 12
  • 13. • Передача данных между корутинами • Примитив синхронизации • Потокобезопасная очередь • Горячий источник данных Что такое каналы 13
  • 14. • Сommunicating sequential processes, CSP • Избегаем разделяемой памяти • Иммутабельные данные Взаимодействующие последовательные процессы 14
  • 15. Как устроены каналы • Несут затраты на синхронизацию • Никита Коваль — Как устроены каналы в корутинах в Kotlin https://www.youtube.com/watch?v=XHMXyYlQ8Eg 15
  • 16. • Какой тип канала выбрать? ○ Channel ■ рандеву ■ буфер ■ связный список ■ conflated ○ Broadcast ○ ConflatedBroadcast • Аналоги для subject из RxJava Сложности 16
  • 17. • Подписаться на канал и не закрыть его Неправильное использование val channel = Channel<String>(1) GlobalScope.launch { channel.consumeEach { println("Consumer: $it") } println("Consumer finished") } GlobalScope.launch { channel.send("Data") // channel.close() println("Producer finished") } 17
  • 18. • Открыть подписку и не потреблять данные Неправильное использование val broadcast = BroadcastChannel<String>(1) GlobalScope.launch { val receive : ReceiveChannel<String> = broadcast.openSubscription() // receive.consumeEach { println("Consumer: $it") } println("Consumer finished") } GlobalScope.launch { delay(500) broadcast.send( "Data1") broadcast.send( "Data2") broadcast.close() println("Producer finished") } 18
  • 19. Неправильное использование val broadcast = BroadcastChannel<Recorder.RecordData>( BUFFER_CAPACITY) while (recorder.isInRecordingState()) { val recordData = recorder.readNext() broadcast.send(recordData) // val success = broadcast.offer(recordData) // if (!success) { // // ... // } } • Не учитывать возможное переполнение 19
  • 20. Неправильное использование • Использование там, где нет необходимости private val channel = BroadcastChannel<ActivityResult>( 1) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) channel.offer(ActivityResult(requestCode, resultCode)) } class FragmentViewModel( private val channel: BroadcastChannel<ActivityResult>) : ViewModelScope() { fun listenResult() { launch {channel.consumeEach { /* process result */ } } } } 20
  • 21. • Обработка “горячего” потока данных: микрофон, входящее сетевое соединение и т.д. • Сведение нескольких потоков данных в один • Безопасная работа с состоянием Правильное использование 21
  • 22. • Были, но deprecated • Были не все, приходилось писать самим Операторы 22
  • 24. @UseExperimental(InternalCoroutinesApi::class) fun <E> ReceiveChannel<E>.distinctUntilChanged( context: CoroutineContext = Dispatchers.Unconfined ) = GlobalScope.produce(context = context, onCompletion = consumes()) { var last: E? = null var isFirstEmmit = true for (next in this@distinctUntilChanged) { if (isFirstEmmit || last != next) { isFirstEmmit = false last = next send(next) } } } DistinctUntilChanged 24
  • 25. DistinctUntilChanged channel.openSubscription() .distinctUntilChanged() .consumeEach { println("consume $it")} consume one consume two consume one val channel = BroadcastChannel<String>(1) launch { with(channel) { repeat(3) { send("one") } repeat(2) { send("two") } repeat(5) { send("one") } } } 25
  • 27. • Модель акторов • Актор: ○ корутина ○ состояние ○ “почтовый ящик” Actor 27
  • 28. Actor val c = actor { // initialize actor's state for (msg in channel) { // process message here } } // send messages to the actor c.send(...) ... // stop the actor when it is no longer needed c.close() 28
  • 29. CombineLatest fun <F, S, R> ReceiveChannel< F>.combineLatest( other: ReceiveChannel< S>, context: CoroutineContext = Dispatchers. Unconfined, transform: (a: F, b: S) -> R): ReceiveChannel< R> { class StatePart(val argNum: Int, val arg1: F?, val arg2: S?) return GlobalScope. produce(context, onCompletion = consumesAll(this, other)) { val actor = actor<StatePart> { var first: F? = null; var second: S? = null var isFirstSet = false; var isSecondSet = false for (next in this) { if (next.argNum == 1) { isFirstSet = true; first = next. arg1 } else { isSecondSet = true; second = next. arg2 } if (isFirstSet && isSecondSet) { @Suppress("UNCHECKED_CAST") send(transform(first as F, second as S)) } } } launch { this@combineLatest .consumeEach { value -> actor.send(StatePart( 1, value, null)) } } launch { other.consumeEach { value -> actor.send(StatePart( 2, null, value)) } } } } 29
  • 30. 30
  • 31. val intCh = BroadcastChannel<Int>(1); val strCh = BroadcastChannel<String>(1) launch { intCh.send(1) intCh.send(2) strCh.send("A") intCh.send(3) strCh.send("B") intCh.send(4) strCh.send("C") strCh.send("D") intCh.send(5) } intCh.openSubscription() .combineLatest(strCh.openSubscription(), transform = { a, b -> "$a$b" }) .consumeEach { println("consume $it") } consume 2A consume 3A consume 3B consume 4B consume 4C consume 4D consume 5D 31
  • 32. • Холодные потоки • Без синхронизации • Операторы • Альтернатива Rx Flow 32
  • 33. DistinctUntilChanged — Flow channel.openSubscription() .distinctUntilChanged() .consumeEach { println("consume $it")} consume one consume two consume one val channel = BroadcastChannel<String>(1) launch { with(channel) { repeat(3) { send("one") } repeat(2) { send("two") } repeat(5) { send("one") } } } channel.asFlow() .distinctUntilChanged() .collect { println("collect $it")} collect one collect two collect one 33
  • 34. val intCh = BroadcastChannel<Int>(1); val strCh = BroadcastChannel<String>(1) launch { intCh.send(1) intCh.send(2) strCh.send("A") intCh.send(3) strCh.send("B") intCh.send(4) strCh.send("C") strCh.send("D") intCh.send(5) } intCh.openSubscription() .combineLatest(strCh.openSubscription(), transform = { a, b -> "$a$b" }) .consumeEach { println("consume $it") } consume 2A consume 3A consume 3B consume 4B consume 4C consume 4D consume 5D intCh.asFlow() .combineLatest(strCh.asFlow(), { a, b -> "$a$b" }) .collect { println("collect $it") } collect 1A collect 2A collect 3A collect 3B collect 4B collect 4C collect 4D collect 5D 34
  • 35. • Блог Романа Елизарова medium.com/@elizarov • kotlinlang.org • github.com/Kotlin/kotlinx.coroutines Что читать 35
  • 36. • Корутины: ○ Лаконичный код без коллбэк хелла ○ Мощный механизм областей видимости ○ Сложность, неочевидные моменты, другая парадигма • Каналы: ○ Область применения ограничена — горячий источник ○ Примитив синхронизации ○ Также есть сложности и неочевидные моменты ○ Экспериментальны? ○ Следить за Flow Резюме 36
  • 37. • Кирилл Филимонов • Александр Шаталов • Владимир Ширяев • Александр Королёв • Виктор Филлипов • Рустам Ситдиков Благодарности 37
  • 39. 39