#2 CoroutineContext. Настраиваем корутины || Курс по корутинам
ฝัง
- เผยแพร่เมื่อ 3 ส.ค. 2024
- Как задать различные параметры для корутины. Что такое CoroutineContext. Как переключить потоки в корутине.
Курс создан при поддержке компании Revolut. Вакансии компании здесь bit.ly/3LGwJ8t
Автор - Кирилл Розов, Android разработчик 10 лет опыта в разработке
🔗 Каналы "Android Broadcast" taplink.cc/android_broadcast
🔗 Поддержать проект taplink.cc/android_broadcast/...
🔗 Coroutine Context kotlinlang.org/docs/coroutine...
#androiddev #android #программирование #kotlin #КириллРозов #андроид #AndroidBroadcast
0:00 Вступление
0:20 Что такое CoroutineContext
1:40 Job. Представление корутины в объекте
4:00 Dispatcher. Управление потоком выполнения
6:30 Как правильно доставить Dispatcher
7:08 CoroutineExceptionHandler
7:59 CoroutineName
8:33 Заключение
8:50 Q&A
💰 Поддержать проект на Boosty boosty.to/androidbroadcast
🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
🔗 Telegram канал "Kotlin Broadcast" ttttt.me/android_broadcast
Кирилл, спасибо за годноту и за вклад в community! Ты делаешь этот мир лучше)
Лучший утренний контент перед работой)
Спасибо за знания) успехов тебе)
Спасибо за материал!
Кирилл, спасибо за шикарный контент
Коротко и без воды, шикарный формат
А кому что-то не понятно - гугл в помощь)
Если бы автор рассказывал о каждой мелочи - то видео бы получилось очень длинным и не охватило бы такую широкую аудиторию, которую охватывает сейчас
Так как для тех, кто, что-то знает по корутинам - было бы много воды
Кирилл, спасибо за отличный контент по kotlin coroutines!
Лучший контент в утро субботы!
Кирилл, спасибо, полезно, интересно ;)
Кратко и по существу
Балдежный курс
Я уже разбираюсь в корутинах, но мне кажется если бы до этого с корутинами не работал было бы сложно все это понять, даже после rx
Я сам их не понял с первого раза и не думаю что такую концепцию легко сразу понять с первого раза
Ну тогда ждем урок еще завтра)))
Спасибо
Да, присоединюсь. Супер подача, коротко и не напряжно. Вопрос от новичка. Как практиковаться в этом? С чего начать практику? Как именно ты начинал практиковаться. Именно начинал.
Смотрю разные источники, везде много теории и элементарные примеры, но хотелось бы примеров посложнее, причем с нарастающим уровнем сложности. Буду рад получить ответ, но даже если не получу, все равно продолжу смотреть тебя👍
Я практиковался уже с опытом в разработке, так что просто взял pet проект или начал писать его чтобы попробовать технологию. + повезло что на работе смог затащить корутины даже в альфа версии в 2017
@@AndroidBroadcast посоветуете как начать практику без опыта, если есть представление как это сделать?
@@speedrages если ты серьезно задаешь такие вопросы, то лучше и не начинать
Вот рекомендую отличный мини курс молодого бойца по корутинам, уверен его можно еще даже расширить и дополнить примерами:
th-cam.com/play/PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_.html
спасибо!👍
Кирилл, ты случайно не оговорился на 4:55, когда сказал, что в пуле потоков IO количество потоков не менее 64? Другие источники говорят "не БОЛЕЕ 64".
Присоединяюсь к благодарностям за чертовски годный курс по корутинам!
Можно посмотреть формулу в исходниках. Для IO максимальный размер пулла очень большой, но все эти потоки создаются по необходимости
Отличное начало курса, в голове прям щелкает от понимания 😄
Отсюда у меня возник вопрос: можно ли указать саспенд функции, что она должна быть запущена в определенном диспатчере? Я видел вариант, что тело функции можно обернуть в нужный withContext, но не хотелось бы лишний раз переключаться
Тот способ через withContext и есть который используется для вызова функции в необходимом контексте, другого пути я не видел
Я так понимаю, что withContext и есть рекомендуемый подход, плюс вообще все функции лучше проектировать main-safe, что если функция может заблочить main поток, ей нужно самой переключить контекст на всякий случай
Кирилл, спасибо за видео!
На 3:33 кажется не совсем корректная инфа - родитель у которого SupervisorJob не отменяется ведь сам при ошибке в дочерней корутине
Верно. Надо будет поправить
На счёт оберток для провайда диспетчеров, мы отказались от этой штуки, т.к. появилась возможность в тестах напрямую сетить диспетчер в класс Dispatchers. Тесты от этого никак не пострадали, а куча классов убрала лишнюю зависимость, которая больше мозолила глаза
Сетать напрямую можно только Main Dispatcher, или я что-то упустил в обновлениях?
Спасибо! По поводу ссылки на енам, не увидел в описании(
Добавлю немного позже
Спасибо огромное за серию видео. Материал немного сложный, пересматриваю повторно.
Вопрос что будет если использовать Default dispatcher с IO операциями? Если при этом Default пул потоков загружен сложной математикой, то часть ядер процессора будут недозагружены?
Default и IO настроены с учётом специфики такого рода операций, если вы выберите неправильно -ничего страшного нет
Привет
Спасибо за курс.
Воспрос: может ли входить main-поток в пул потоков Default dispatcher?
Нет, в том то и суть чтобы разгрузить главный поток
В курсе будет какое-нибудь (например, итоговое) видео с разбором того, во что компилятор преобразовывает корутину и как она под капотом работает?
Нет
@@AndroidBroadcast спасибо за ответ) а мне на работе уже пару коллег советовали извучить данный вопрос
Ещё не хватило инфы про переключение контекста с помощью withContext) о его плюсах и минусах
Оно будет в следующем видео
Благодарю за этот курс! Круто
Подскажите пожалуйста какой контекст нужно использовать в CoroutineScope для работы с базой , когда корутина что-то вытаскивает из Room ?
У меня, например val coroutineScope = CoroutineScope(Dispatchers.Default), но не уверен, что это правильно
Лучше взять IO, так как БД - это чтение/запись с/на диск
Если в Dao у метода прописать suspend, то запросы будут выполнятся на Room-овском Dispatcher-е и не надо использовать какой то другой диспатчер. Такое же поведение и у Retrofit-a
@@BelokonRoman , а с Realm такое возможно?
@@user-eh2jg6oh5b не знаю, я с Realm не работаю.
спасибо за крутой контент.
Одно не понял:
Зачем нужен лишние потоки (64 потоков) для io если у нас 8 процессоров (кажется 8 потоков достаточна)? Вед корутины (в отличий от обычных потоков) освобождают свой поток при блокирующем вызове (например запрос в сеть). То есть потоки никогда не будут в wait состояние и нет необходимости для context switch
Для того чтобы так происходило, I/O должен быть тоже suspend, но пока он только блокирующий (
@@AndroidBroadcast то есть сейчас при io запросах (в отличий от delay() допустим) поток не освобождается? Или я чето не понял? В первом видео вроде в обратном говорили: что несколько корутин могут в отдом потоке выполнятся
Комментарий.
Привет
Я правильно понимаю, что пул потоков, при использовании Dispatcher.IO состоит из нативныех потоков (которых ещё 64)?
Буду очень благодарен за ответ, давно не могу разобраться в этом простом вопросе
64 - это максимум. Потоком создаются отложенно по необходимости
Кирилл, можете пояснить один момент? Функция Join приостанавливает коррутину пока job'а не выполниться(Suspends the coroutine until this job is complete. ) Если Job это абстракция над коррутингой, то как она может выполняться с приостановленной корутиной? В некоторых статьях вижу такую формулировку "Например, его метод join() позволяет ожидать, пока корутина не завершится"
При создание корутины через launch или async вы получаете объект Job, который и представляет её. join() - это suspend функция, которая приостановит корутину в которой была вызвана, до тех пор пока не будет выполнена Job (корутина) у которой вызвали join()
Почему вы советуете не использовать Dispatchers напрямую, а закидывать их обёртку через DI? Я пользуюсь ими напрямую, не могу вспомнить, чтобы возникали проблемы с этим
Проблем нет, но вот в тестах из удобнее подменять
Я где-то давно читал, что IO dispatcher умеет только расширяться, но не умеет утилизировать ненужные потоки.
Ты не знаешь, они уже это поправили или так и осталось?
Без понятия такой подробности. Но каждый раз уничтожать потоки и убивать их невыгодно, так что такое поведение оправдано
@@AndroidBroadcast Тут проблема, что если во время каких-то нагрузок количество потоков сильно увеличится(например до 40), то потом они будут простаивать. Думаю именно по этому и создали limitedParallelism.
Да, там его и в Changelog так и объяснили
+
Что значит интенсивно вычислительных операций? main же главный поток вроде
Главный поток больше служит как координатор и гарант последовательного вызова. Например, работа с UI, запуск асинхронных операций на других потоках и применение их результата, системные вызовы. Этот потом должен быть загружен как можно меньше, так как в него попадают все взаимодействия пользователя с экраном
В IO количество потоков равно количеству ядер процессора, но не меньше 64х?
Т.е. всегда не меньше 64х?
Потому что я не знаю SOC, в котором есть столько ядер)
Upd.
Разобрался в вопросе. На самом деле, по умолчанию в IO НЕ БОЛЬШЕ 64х потоков.
Очень красивое лицо, но лучше было бы смотреть на код, который мелькает не понятно для чего.
Речь лучше не как на рынке при навязывании товара, а помедленнее, если, конечно же, это разъяснение для новичков, а не хвастаство перед равными.
2:53 2 и 4 одинаковые вроде
Ага, проверю. Спасибо
Как всегда, поверхностно, без объяснения. Тем, кому это действительно важно и они хотят понять, здесь делать нечего. Элементарный пример, ИО, ИО... Не все кто хочет разобраться с корутинами знают, что это абревиатура InputOutput и для чего этот поток. В общем как и с даггером, контент ради контента, а не для людей...
Коммент не критики ради, просто хочется действительно толкового объяснения, а не просто пересказ доки.
Ещё раз - это контент не для новичков, а уже понимающих профессию. Пишите вопросы и я сделаю доп разбор со всеми пояснениями. Знаете как сделать лучше, покажите мне своим примерос
Вот рекомендую отличный мини курс молодого бойца по корутинам, уверен его можно еще даже расширить и дополнить примерами:
th-cam.com/play/PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_.html